Ejemplo n.º 1
0
static uint8_t sd_write_block(uint32_t block, uint8_t *buf)
{
	int32_t i;
	uint8_t res;

	spi_start();
	while (sd_command(WRITE_SINGLE_BLOCK, block) != 0x00);
	
	spi_sendrecv(0xfe);
	for (i = 0; i < 512; i++)    
  		spi_sendrecv(buf[i]);
	spi_sendrecv(0xff);  
	spi_sendrecv(0xff);

	res = spi_sendrecv(0xff);

	if ((res & 0x1f) != 0x05) {		//res = 0bXXX0AAA1 ; AAA='010' - data accepted
  		spi_stop();			//AAA='101' - CRC error
						//AAA='110' - write error
  		return res;
	}

	while (!spi_sendrecv(0xff));

	spi_stop();
	spi_sendrecv(0xff);

	spi_start();
	while (!spi_sendrecv(0xff));
	spi_stop();

	return 0;
}
Ejemplo n.º 2
0
void spi_read(uint8_t addr , uint8_t *data, uint8_t len)
{
	uint8_t i;

	spi_start();
	spi_write_byte(addr);

	for (i = 0; i < len; i++){
		*((data + i)) = spi_read_byte();
	}
	spi_stop();
}
Ejemplo n.º 3
0
void spi_write(uint8_t addr , uint8_t *data, uint8_t len)
{
	uint8_t i;

	spi_start();
	spi_write_byte((0x80|addr));

	for (i = 0; i < len; i++){
		spi_write_byte(*(data + i));
	}
	spi_stop();
}
Ejemplo n.º 4
0
int main(void){
	int i;
	char buf[50] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'};
	
	spi_setup();
	
	spi_start();
	for (i = 0; i < 10; i++)
		buf[i] = spi_transfer(buf[i]);
	spi_stop();
	
	return 0;
}
Ejemplo n.º 5
0
static void sd_read_block(uint32_t block, uint8_t *buf)
{
	int32_t i;

	spi_start();
	
	while (sd_command(READ_SINGLE_BLOCK, block) != 0x00);
	while (spi_sendrecv(0xff) != 0xfe);
	
	for (i = 0; i < 512; i++)
  		buf[i] = spi_sendrecv(0xff);
	
	spi_sendrecv(0xff); 
	spi_sendrecv(0xff); 
	
	spi_stop();
}
Ejemplo n.º 6
0
static void sd_init(void)
{
	int32_t i;
	
	spi_setup(SPI_CS0, 0);
	
	for (i = 0; i < 10; i++)
		spi_sendrecv(0xff);
	
	spi_start();
	while (sd_command(GO_IDLE_STATE, 0) != 0x01);
	while (sd_command(SEND_IF_COND, 0x000001AA) != 0x01);
	while (sd_command(APP_CMD, 0) && sd_command(SD_SEND_OP_COND, 0x40000000));
	while (sd_command(READ_OCR, 0) != 0x00);
	
	spi_stop();
}
Ejemplo n.º 7
0
void spi_tx_word(uint8_t addr, uint16_t w)
{
	uint8_t i;

	spi_start();
	spi_write_byte((0x80|addr));//send addr
	for (i = 0; i< 16; i++){
		if (w & 0x8000) {
			spi_tx_bit(1);
		}
		else {
			spi_tx_bit(0);
		}
		w <<= 1;
	}
	spi_stop();
}
Ejemplo n.º 8
0
uint16_t spi_rx_word(uint8_t addr)
{
	uint8_t i;
	uint16_t w = 0;
	uint8_t spi_bit;

	spi_start();
	spi_write_byte(addr);// send addr
	for (i = 0; i< 16; i++){
		spi_rx_bit(spi_bit);
		w <<= 1;
		if (spi_bit)
			w |= 1;
	}
	spi_stop();

	return w;
}
Ejemplo n.º 9
0
int change_variable(void *p, values_t variance, var_bound vlue_bound, uint32_t prev_val)
{
    int set_failed = 1;
    int i;
    
#if defined (RS_ENABLED)
    USART6_stop();
#elif defined (SPI_ENABLED)
    spi_stop();
#endif
    
    //Check variables for validity
    if (variance == discrete){
        if (vlue_bound.boundary != NULL){
            for (i = 0; i < vlue_bound.num_el; i++){
                if (vlue_bound.boundary[i] == *(uint32_t*)p)
                    break;
            }
            if (i < vlue_bound.num_el)  
                set_failed = 0;
        }
    }
    if (variance == min_max){
        if (vlue_bound.boundary != NULL){
            if( *(uint32_t*)p >= vlue_bound.boundary[0] && *(uint32_t*)p <= vlue_bound.boundary[1])
                set_failed = 0;
        }
    }
    
    if (variance == any)
        set_failed = 0;
    
    if (set_failed){
        //restore previous value
        *(uint32_t*)p = prev_val;
        conf_periph_init();
        return 1;
    }
        
    //call interfaces init with new config
    conf_periph_init();
    
    return 0;
}
Ejemplo n.º 10
0
void
spi_hw_init_master(const spi_bus_t spi_num) {
  /* Clear lock variable */
  spi_lock[spi_num] = 0;

  /* Block access to the bus */
  spi_acquire_bus(spi_num);

  /* enable clock gate */
  spi_start(spi_num);

  /* Clear MDIS to enable the module. */
  BITBAND_REG(SPI[spi_num]->MCR, SPI_MCR_MDIS_SHIFT) = 0;

  /* Enable master mode, select chip select signal polarity */
  /* XXX: Hard-coded chip select active low */
  /* Disable FIFOs, this can be improved in the future */
  SPI[spi_num]->MCR = SPI_MCR_MSTR_MASK | SPI_MCR_PCSIS(0x1F) | SPI_MCR_DIS_RXF_MASK | SPI_MCR_DIS_TXF_MASK;

  /* Enable interrupts for TCF flag */
  BITBAND_REG(SPI[spi_num]->RSER, SPI_RSER_TCF_RE_SHIFT) = 1;
  switch(spi_num) {
    case SPI_0:
  NVIC_EnableIRQ(SPI0_IRQn);
      break;
    case SPI_1:
      NVIC_EnableIRQ(SPI1_IRQn);
      break;
    case SPI_2:
      NVIC_EnableIRQ(SPI2_IRQn);
      break;
  }

  /* disable clock gate */
  spi_stop(spi_num);

  /* Allow access to the bus */
  spi_release_bus(spi_num);
}
Ejemplo n.º 11
0
void spi_init(void)
{
	spi_stop();
	spi_clk_l();
}