STM32-G474RE-SPI从EEPROM读取数据时出现问题



我有个问题。我的EEPROM是93lc66b。我正在写以下内容,然后读取数据。

uint16_t Inst_EWEN = 0x9800;
uint16_t Inst_WRITE = 0xA01F;
uint16_t Inst_Read = 0xC000;
uint16_t dataIn = 2;
uint8_t dataForUart[20];
int messageLength;
//Switch off CS
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, GPIO_PIN_RESET);
HAL_Delay(100);
//switch on CS for EWEN
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, GPIO_PIN_SET);
HAL_SPI_Transmit(&hspi2, &Inst_EWEN, 1, 1000);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, GPIO_PIN_RESET);
HAL_Delay(0.3);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, GPIO_PIN_SET);
HAL_SPI_Transmit(&hspi2, &Inst_WRITE, 1, 1000);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, GPIO_PIN_RESET);
///////////////////////////////////////////////////////////////////////////////////
//Switch on CS for read
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, GPIO_PIN_SET);
HAL_SPI_Transmit(&hspi2, &Inst_Read, 1, 1000);
HAL_SPI_Receive(&hspi2, &dataIn, 1, 1000);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, GPIO_PIN_RESET);
HAL_Delay(100);
///////////////////////////////////////////////////////////////////////////////////
//Send to Uart na UART'a
messageLength = sprintf(&dataForUart,"Read data: %d", dataIn);
HAL_UART_Transmit(&hlpuart1, &dataForUart, messageLength, 1000);`

执行完这个函数后,我得到了0。我不知道我是否理解数据表。首先,我必须发送EWEN操作(1001100000000000-0x9800(。下一次写入操作(1010000000011111-0xA01F(和下一次读取操作(110000000000000-0xC000(。也许我不太了解比特是如何工作的?

93lc66不是SPI部件,而是微丝。如果你想使用SPI接口访问microwire存储器,那么你需要在读取和写入之间改变时钟相位。

在CPHA=0的情况下写入,在CPHA=1的情况下读取响应。请注意,您需要禁用外围设备才能更改模式。

还要注意,命令字长度不一定是8位的倍数;你需要在左边加上零。你上面的例子似乎是右边的填充。这是不正确的,这将意味着您对数据的错位。

  1. 断言CS线路,此设备需要将其拉高
  2. 发送EWEN指令,根据数据表,EWEN指令是0xC0,所以只有一个字节
  3. 根据数据表将16位数据写入地址(256 x 16位(1字节地址+2字节数据
  4. 通过将地址写入DI并观察DO上返回的数据,尝试将其读回来(在这里,我实际上不确定是否需要在输入上提供伪字节(

小编,在阅读了Tom的回答后,我检查了SPI协议的时序图和设备数据表,得到了CPOL=0和CPHA=0。汤姆:(

最新更新