23K640 SRAM写入失败求助:可读取单元但无法写入
23K640 SRAM写入失败的问题排查与修复
核心问题1:写入函数未控制CS片选引脚
你的Spi23K640Wr8函数完全没有操作CS引脚,SPI设备的读写必须通过拉低CS选中设备,操作完成后拉高释放。读取函数里有正确的CS控制逻辑,但写入函数缺失这一步,这是写入失败的直接原因。
修复后的写入函数:
void Spi23K640Wr8(uint32_t address, uint8_t data_byte) { digitalWrite(CS, LOW); // 选中SRAM设备 SPI.transfer(WRITE); // 23K640为8192字节容量,地址仅需13位,无需16位偏移操作 SPI.transfer((uint8_t)(address >> 8) & 0xff); SPI.transfer((uint8_t)address); SPI.transfer(data_byte); digitalWrite(CS, HIGH); // 操作完成后释放设备 }
核心问题2:引脚定义冲突
你注释中标注MOSI是pin8,但代码里定义int CSS = 8;,还将该引脚设为输出并拉高,这会直接占用MOSI引脚,导致SPI数据发送异常。需要修改CSS的引脚定义为闲置引脚:
// 将CSS改为未使用的引脚,例如pin7 int CSS = 7;
其他优化与修正建议
- 地址范围修正:23K640的最大有效地址是8191,你的写入循环
for (i=0; i<=8192; i++)会越界访问,应改为i<8192。 - SPI参数确认:23K640默认使用SPI模式0(CPOL=0,CPHA=0),Arduino的
SPI.begin()默认符合该模式,但如果有修改过SPI设置,建议显式指定参数:
SPI.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE0));
将上述代码放在SPI.begin()之后,确保通信参数匹配芯片要求。
3. 冗余代码清理:删除写入函数中无用的SPI.transfer((uint8_t)(address >> 16) & 0xff);行,23K640的地址仅需13位,16位偏移后的值始终为0,属于冗余操作。
硬件排查补充
如果修改代码后仍无法写入,检查以下硬件问题:
- 确认SRAM的VCC、GND供电符合规格(3.3V或5V,参考芯片手册)
- 检查SCK、MOSI、MISO引脚接线是否正确,无虚焊或接反
- 确认CS引脚与Arduino的pin12连接牢固,无短路
内容的提问来源于stack exchange,提问作者baliyu
相关产品推荐
相关产品推荐

