问题描述
我有问题。我的 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_SET);
HAL_SPI_Transmit(&hspi2,&Inst_EWEN,1,1000);
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_RESET);
HAL_Delay(0.3);
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_SET);
HAL_SPI_Transmit(&hspi2,&Inst_WRITE,GPIO_PIN_RESET);
///////////////////////////////////////////////////////////////////////////////////
//Switch on CS for read
HAL_GPIO_WritePin(GPIOC,&Inst_Read,1000);
HAL_SPI_Receive(&hspi2,&dataIn,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) 和下一个读操作 (1100000000000000 - 0xC000)。也许我不太了解位是如何工作的?
解决方法
- 置位 CS 线,此设备需要将其拉高。
- 发送 EWEN 指令,根据 datasheet EWEN 指令是
0xC0
所以只是一个字节。 - 根据数据表将 16 位数据写入地址(256 x 16 位)中 1 字节地址 + 2 字节数据
- 尝试将其读回,方法是将地址写入 DI 并观察 DO 上返回的数据(这里我实际上不确定您是否需要在输入中提供虚拟字节)
小编辑,在阅读了汤姆的回答后,我检查了 SPI 协议的 timing diagram 和设备数据表,我得到了 CPOL = 0 和 CPHA = 0。如果我在这里错了,请纠正我:)
,93lc66 不是 SPI 部件,它是微线。如果要使用 SPI 接口访问微线存储器,则需要更改读取和写入之间的时钟相位。
CPHA=0 写入,CPHA=1 读取响应。请注意,您需要禁用外设才能更改模式。
还要注意命令字长不一定是8位的倍数;你需要在左边用零填充它。您上面的示例似乎在右侧填充。这是不正确的,这意味着您对数据未对齐。