Hi,
I am using customized nrf52 board with softdevice s132
I am trying to interface External Flash (MX25L64) using spi.so when ever i am trying to send any command /data to external flash i am getting only zero in the receiving buffer or else other values.
I have interfaced the same application code for writing/reading/sending command to External Flash with STM32 board and it worked fine because i wanted to check is there any hardware issue with my external Flash or not.But when i am trying with nordic it is showing some different behavior.
The complete code is same only the difference is transferring call for Stm32 and nordic
i have used their call for 1 byte transferring and our spi transferring call in my case i.e
err_code = nrf_drv_spi_transfer(&spi, &Byte, 2, pData, 2);
APP_ERROR_CHECK(err_code);
here it returned err_code as Zero every time when it comes to this call,which means it returned NRF_SUCCESS.
instead of sending and receiving two bytes,if i go with 1 byte it is giving showing different behavior.
i don't understand where i am making mistake.so please help me regarding this issue as soon as possible.
i am sending u the log statements and my code,so that problem can be easily found.
thank you.
code:
#define SPI_INSTANCE 2
static const nrf_drv_spi_t spi = NRF_DRV_SPI_INSTANCE(SPI_INSTANCE); /**< SPI instance. */
static volatile bool spi_xfer_done;
uint8_t Rxbuff[100];
void Mx25L64_Init()
{
printf("Spi...Init....\r\n");
Spi_Init();
FLASH_IO_CS_High();
}
uint32_t Mx25L64_ReadID()
{
uint32_t Temp = 0, Temp0 = 0, Temp1 = 0, Temp2 = 0;
/* Select the FLASH: Chip Select low */
FLASH_IO_CS_Low();
/* Send "RDID " instruction */
Temp=FLASH_IO_WriteByte(0x9F);
/* Read a byte from the FLASH */
Temp0 = FLASH_IO_WriteByte(0);
/* Read a byte from the FLASH */
Temp1 = FLASH_IO_WriteByte(0);
/* Read a byte from the FLASH */
Temp2 = FLASH_IO_WriteByte(0);
printf("Temp = %d Temp0 = %d Temp1 =%d Temp2 = %d\r\n",Temp,Temp0,Temp1,Temp2);
/* Deselect the FLASH: Chip Select high */
FLASH_IO_CS_High();
Temp = (Temp0 << 16) | (Temp1 << 8) | Temp2;
return Temp;
}
/*==================================================================
Write 1 byte to flash memory
WARNING: you can only write to previously erased memory locations (see datasheet)
use the block erase commands to first clear memory (write 0xFFs)
==================================================================*/
void Mx25L64_BYTE_Write( uint8_t byt,uint32_t addr)
{
printf("\n\rbyte write done beginning \r\n");
FLASH_IO_CS_Low();
FLASH_IO_WriteByte(SPIFLASH_WRITEENABLE);
FLASH_IO_CS_High();
// while(Mx25L64_readStatus()!=0x02)
// {
// nrf_delay_ms(1000);
// printf("\n\rNot in write enable Wait\r\n");
// }
FLASH_IO_CS_Low();
FLASH_IO_WriteByte(SPIFLASH_BYTEPAGEPROGRAM);
FLASH_IO_WriteByte(addr>>16);
FLASH_IO_WriteByte(addr>>8);
FLASH_IO_WriteByte(addr);
FLASH_IO_WriteByte(byt);
FLASH_IO_CS_High();
printf("\n\rbyte write done end\r\n");
}
/*==================================================================
// read 1 byte from flash memory
==================================================================*/
uint8_t Mx25L64_BYTE_Read(uint32_t addr)
{
uint8_t *RxBuffer;
FLASH_IO_CS_Low();
FLASH_IO_WriteByte(SPIFLASH_READ);
FLASH_IO_WriteByte(addr>>16);
FLASH_IO_WriteByte(addr>>8);
FLASH_IO_WriteByte(addr);
RxBuffer=FLASH_IO_WriteReadByte(0,1);
uint8_t result=RxBuffer[0];
printf("\n\r%x%x%x%x\r\n",RxBuffer[0],RxBuffer[1],RxBuffer[2],RxBuffer[3]);
FLASH_IO_CS_High();
return result;
}
/**
* @brief SPI user event handler.
* @param event
*/
void spi_event_handler(nrf_drv_spi_evt_t const * p_event,
void * p_context)
{
spi_xfer_done = true;
}
void Spi_Init(void)
{
ret_code_t err_code;
nrf_drv_spi_config_t spi_config = NRF_DRV_SPI_DEFAULT_CONFIG;
spi_config.ss_pin = SPI_SS_PIN;
spi_config.miso_pin = SPI_MISO_PIN;
spi_config.mosi_pin = SPI_MOSI_PIN;
spi_config.sck_pin = SPI_SCK_PIN;
err_code = nrf_drv_spi_init(&spi, &spi_config, spi_event_handler, NULL);
APP_ERROR_CHECK(err_code);
printf("\n\rSPI example started. = %d \n",err_code);
}
/**
* @brief Sends a Byte through the SPI interface & CHECK RESPONSE
* @param Byte : Byte send.
*/
uint8_t SPIx_WriteRead(const nrf_drv_spi_t spi,uint8_t Byte)
{
ret_code_t err_code;
uint8_t pData[4];
spi_xfer_done = false;
/* Send a Byte through the SPI peripheral */
/* Read byte from the SPI bus */
err_code = nrf_drv_spi_transfer(&spi, &Byte, 2, pData, 2);
APP_ERROR_CHECK(err_code);
while(!spi_xfer_done)
{
__WFE();
}
printf("\n\rByte = %d and SPI_WRITE_READ = %d == %d === %d ==== %d err_code = %d\r\n",Byte,pData[0],pData[1],pData[2],pData[3],err_code);
return pData[2];
}
/**
* @brief SPI Flash CS High
* @param
* @retval
*/
void FLASH_IO_CS_High()
{
nrf_gpio_pin_set(SPI_SS_PIN);
}
/**
* @brief SPI Flash CS low
* @param
* @retval
*/
void FLASH_IO_CS_Low()
{
nrf_gpio_pin_clear(SPI_SS_PIN);
}
/**
* @brief write data to flash
* @param TxData: Data to transfer
* @retval Retur data
*/
uint8_t FLASH_IO_WriteByte(uint8_t TxData)
{
return SPIx_WriteRead(spi ,TxData);
}
/**
* @brief write data to flash
* @param TxData: Data to transfer
* @retval Retur data
*/
uint8_t* FLASH_IO_WriteReadByte(uint8_t data,uint8_t len)
{
ret_code_t err_code;
err_code = nrf_drv_spi_transfer(&spi, &data, len, Rxbuff, len);
APP_ERROR_CHECK(err_code);
return Rxbuff;
}
int main(void)
{
/* timer initialisation */
timer_init();
/* all ble profiles init */
aqua_all_fun_init();
/* uart init */
uart_init();
/* 7 seg Display init */
display_init();
/* transmitter power set to +4db and role set to conn */
sd_ble_gap_tx_power_set(2,1,+4);
/* 7 segment display current firware ver */
display_int(farmware_ver,0);
nrf_delay_ms(5000);
display_int(0,0);
initialize_motor_app();
nrf_gpio_pin_set(LED_1);
nrf_gpio_pin_set(LED_2);
nrf_gpio_pin_set(LED_3);
nrf_gpio_cfg_output(SPI_SS_PIN);
Mx25L64_Init();
uint32_t Id = Mx25L64_ReadID();
printf("Id = %d \r\n",Id);
Mx25L64_BYTE_Write(5,1);
Id = Mx25L64_BYTE_Read(1);
printf("Mx25L64_BYTE_Read = %d \r\n",Id);
/* Enter main loop. */
for (;;)
{
}
}
/* i have send u the function calls and the operations inside those functions */
log statements by using nordic spi interface :
Spi...Init.... SPI example started. = 0 Byte = 159 and SPI_WRITE_READ = 0 == 194 === 0 ==== 0 err_code = 0 Byte = 0 and SPI_WRITE_READ = 0 == 0 === 0 ==== 0 err_code = 0 Byte = 0 and SPI_WRITE_READ = 0 == 0 === 0 ==== 0 err_code = 0 Byte = 0 and SPI_WRITE_READ = 0 == 0 === 0 ==== 0 err_code = 0 Temp = 0 Temp0 = 0 Temp1 =0 Temp2 = 0 Id = 0 byte write done beginning Byte = 6 and SPI_WRITE_READ = 0 == 0 === 2 ==== 0 err_code = 0 Byte = 2 and SPI_WRITE_READ = 0 == 0 === 2 ==== 0 err_code = 0 Byte = 0 and SPI_WRITE_READ = 0 == 0 === 2 ==== 0 err_code = 0 Byte = 0 and SPI_WRITE_READ = 0 == 0 === 2 ==== 0 err_code = 0 Byte = 1 and SPI_WRITE_READ = 0 == 0 === 2 ==== 0 err_code = 0 Byte = 5 and SPI_WRITE_READ = 0 == 0 === 2 ==== 0 err_code = 0 byte write done end Byte = 3 and SPI_WRITE_READ = 0 == 0 === 0 ==== 0 err_code = 0 Byte = 0 and SPI_WRITE_READ = 0 == 0 === 0 ==== 0 err_code = 0 Byte = 0 and SPI_WRITE_READ = 0 == 0 === 0 ==== 0 err_code = 0 Byte = 1 and SPI_WRITE_READ = 0 == 0 === 0 ==== 0 err_code = 0 0000 Mx25L64_BYTE_Read = 0
and i am also sending u the log statements of stm32 spi interface:
***spi initilization*** Byte = 159 and pData = 255 = 0 = 0 = 0 Byte = 0 and pData = 194 = 0 = 0 = 0 Byte = 0 and pData = 32 = 0 = 0 = 0 Byte = 0 and pData = 23 = 0 = 0 = 0 Id = 12722199 Byte = 6 and pData = 255 = 0 = 0 = 0 Byte = 5 and pData = 255 = 0 = 0 = 0 Byte = 0 and pData = 2 = 0 = 0 = 0 Byte = 0 and pData = 2 = 0 = 0 = 0 Byte = 0 and pData = 2 = 0 = 0 = 0 Byte = 2 and pData = 255 = 0 = 0 = 0 Byte = 0 and pData = 255 = 0 = 0 = 0 Byte = 0 and pData = 255 = 0 = 0 = 0 Byte = 1 and pData = 255 = 0 = 0 = 0 Byte = 4 and pData = 255 = 0 = 0 = 0 Byte = 3 and pData = 255 = 0 = 0 = 0 Byte = 0 and pData = 255 = 0 = 0 = 0 Byte = 0 and pData = 255 = 0 = 0 = 0 Byte = 1 and pData = 255 = 0 = 0 = 0 4000 Mx25L64_BYTE_Read = 4