You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;

其他优化与修正建议

  1. 地址范围修正:23K640的最大有效地址是8191,你的写入循环for (i=0; i<=8192; i++)会越界访问,应改为i<8192。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 08:40:47