Read & Write SPI Dataflash

ChibiOS public support forum for topics related to the STMicroelectronics STM32 family of micro-controllers.

Moderator: RoccoMarco

Post Reply
vambwodonk
Posts: 15
Joined: Tue Oct 14, 2014 5:36 am

Read & Write SPI Dataflash

Post by vambwodonk »

After successfully read write SPI flash AT45DB161 using STD peripheral, i try to porting my code to chibios SPI.
I can read status data register with this code,
STDperiph,

Code: Select all

uint8_t AT45DB_StatusRegisterRead(void){
   uint8_t i;
   FLASH_CS_0();
   spi_readwrite(AT45DB_READ_STATE_REGISTER);
   i = spi_readwrite(0xFF);
   FLASH_CS_1();
   return i;
}

in ChibiOS,

Code: Select all

uint8_t AT45DB_StatusRegisterRead(void){
   spiAcquireBus(&SPID1);              /* Acquire ownership of the bus.    */
   spiStart(&SPID1, &hs_spicfg);       /* Setup transfer parameters.       */
   spiSelect(&SPID1);
   tx_buf[0]=AT45DB_READ_STATE_REGISTER;
   spiSend(&SPID1,1,tx_buf);
   spiReceive(&SPID1,1,rx_buf);
   spiUnselect(&SPID1);                /* Slave Select de-assertion.       */
   spiReleaseBus(&SPID1);              /* Ownership release.               */
   return rx_buf[0];
}

But Read write code is fail,
STDperiph,

Code: Select all

void read_page(uint32_t page){
   uint16_t i;
   FLASH_CS_0();

   spi_readwrite(AT45DB_MM_PAGE_READ);
   spi_readwrite((uint8_t)(page >> 6));
   spi_readwrite((uint8_t)(page << 2));
   spi_readwrite(0x00);

   // 4 don't care bytes
   spi_readwrite(0x00);
   spi_readwrite(0x00);
   spi_readwrite(0x00);
   spi_readwrite(0x00);

   for (i = 0; i < DMA_BUFFER_SIZE; i++)
      rxbuf[i] = spi_readwrite(0x00);

   FLASH_CS_1();
}
void write_page(uint32_t page)
{
   uint16_t i;
   FLASH_CS_0();
   spi_readwrite(AT45DB_MM_PAGE_PROG_THRU_BUFFER1);
   spi_readwrite((uint8_t) (page >> 6));
   spi_readwrite((uint8_t) (page << 2));
   spi_readwrite(0x00);

   memcpy(tx_buf,"Hello World\r\n",13);
   for (i = 0; i < DMA_BUFFER_SIZE; i++)
      spi_readwrite(txbuf[i]);

   FLASH_CS_1();
   wait_busy();
}

in ChibiOS,

Code: Select all

void read_page(uint32_t page)
{
   spiAcquireBus(&SPID1);              /* Acquire ownership of the bus.    */
   spiStart(&SPID1, &hs_spicfg);       /* Setup transfer parameters.       */
   spiSelect(&SPID1);

   tx_buf[0]=AT45DB_MM_PAGE_READ;
   tx_buf[1]=(uint8_t)(page >> 6);
   tx_buf[2]=(uint8_t)(page << 2);
   tx_buf[3]=0x00;
   // 4 don't care bytes
   tx_buf[4]=0x00;
   tx_buf[5]=0x00;
   tx_buf[6]=0x00;
   tx_buf[7]=0x00;
   spiSend(&SPID1,8,tx_buf);

   spiReceive(&SPID1,DMA_BUFFER_SIZE,rx_buf);

   spiUnselect(&SPID1);                /* Slave Select de-assertion.       */
   spiReleaseBus(&SPID1);              /* Ownership release.               */
}
void write_page(uint32_t page)
{
   spiAcquireBus(&SPID1);              /* Acquire ownership of the bus.    */
   spiStart(&SPID1, &hs_spicfg);       /* Setup transfer parameters.       */
   spiSelect(&SPID1);

   tx_buf[0]=AT45DB_MM_PAGE_PROG_THRU_BUFFER1;
   tx_buf[1]=(uint8_t)(page >> 6);
   tx_buf[2]=(uint8_t)(page << 2);
   tx_buf[3]=0x00;
   spiSend(&SPID1,4,tx_buf);

   memcpy(tx_buf,"Hello World\r\n",13);
   spiSend(&SPID1,DMA_BUFFER_SIZE,tx_buf);

   wait_busy();

   spiUnselect(&SPID1);                /* Slave Select de-assertion.       */
   spiReleaseBus(&SPID1);              /* Ownership release.               */
}

Any suggestions?
Arif,
User avatar
Giovanni
Site Admin
Posts: 14892
Joined: Wed May 27, 2009 8:48 am
Has thanked: 1202 times
Been thanked: 996 times

Re: Read & Write SPI Dataflash

Post by Giovanni »

Use spiExchange(), send and THEN receive is different from "readwrite".

Giovanni
Post Reply