gpt4 book ai didi

c - M95128-W EEPROM。每页的第一个字节未正确写入或读取

转载 作者:太空狗 更新时间:2023-10-29 15:25:45 28 4
gpt4 key购买 nike

我正在开发一个用于控制 M95128-W EEPROM 的库来自 STM32 设备。我让库写入和读回数据,但是每页的第一个字节与预期不符,似乎固定在 0x04

例如,我在两页中写入 128 个字节,从 0x00 地址开始,值为 0x80。回读时我得到:

byte[0] = 0x04;
byte[1] = 0x80;
byte[2] = 0x80;
byte[3] = 0x80;
.......
byte[64] = 0x04;
byte[65] = 0x80;
byte[66] = 0x80;
byte[67] = 0x80;

我已使用逻辑分析仪调试 SPI 并确认正在发送正确的字节。当在读取命令上使用逻辑分析仪时,mysterios 0x04 从 EEPROM 传输。

这是我的代码:

void FLA::write(const void* data, unsigned int dataLength, uint16_t address)
{
int pagePos = 0;
int pageCount = (dataLength + 64 - 1) / 64;
int bytePos = 0;
int startAddress = address;

while (pagePos < pageCount)
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2, GPIO_PIN_SET); // WP High
chipSelect();

_spi->transfer(INSTRUCTION_WREN);
chipUnselect();

uint8_t status = readRegister(INSTRUCTION_RDSR);

chipSelect();

_spi->transfer(INSTRUCTION_WRITE);
uint8_t xlow = address & 0xff;
uint8_t xhigh = (address >> 8);
_spi->transfer(xhigh); // part 1 address MSB
_spi->transfer(xlow); // part 2 address LSB


for (unsigned int i = 0; i < 64 && bytePos < dataLength; i++ )
{
uint8_t byte = ((uint8_t*)data)[bytePos];
_spi->transfer(byte);

printConsole("Wrote byte to ");
printConsoleInt(startAddress + bytePos);
printConsole("with value ");
printConsoleInt(byte);
printConsole("\n");

bytePos ++;
}

_spi->transfer(INSTRUCTION_WRDI);

chipUnselect();
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2, GPIO_PIN_RESET); //WP LOW

bool writeComplete = false;
while (writeComplete == false)
{
uint8_t status = readRegister(INSTRUCTION_RDSR);

if(status&1<<0)
{
printConsole("Waiting for write to complete....\n");
}

else
{
writeComplete = true;
printConsole("Write complete to page ");
printConsoleInt(pagePos);
printConsole("@ address ");
printConsoleInt(bytePos);
printConsole("\n");
}
}

pagePos++;
address = address + 64;
}

printConsole("Finished writing all pages total bytes ");
printConsoleInt(bytePos);
printConsole("\n");
}
void FLA::read(char* returndata, unsigned int dataLength, uint16_t address)
{
chipSelect();
_spi->transfer(INSTRUCTION_READ);
uint8_t xlow = address & 0xff;
uint8_t xhigh = (address >> 8);
_spi->transfer(xhigh); // part 1 address
_spi->transfer(xlow); // part 2 address

for (unsigned int i = 0; i < dataLength; i++)
returndata[i] = _spi->transfer(0x00);
chipUnselect();


}

感谢任何建议或帮助。

更新:

我已经尝试按顺序写入 255 个字节的递增数据来检查翻转。结果如下:

byte[0] = 4; // Incorrect Mystery Byte 
byte[1] = 1;
byte[2] = 2;
byte[3] = 3;
.......
byte[63] = 63;
byte[64] = 4; // Incorrect Mystery Byte
byte[65] = 65;
byte[66] = 66;
.......
byte[127] = 127;
byte[128] = 4; // Incorrect Mystery Byte
byte[129} = 129;

模式继续。我也试过从地址 0x00 开始只写 8 个字节,同样的问题仍然存在,所以我认为我们可以排除翻转。

我已经尝试删除调试 printConsole,但没有任何效果。

这是写入命令的 SPI 逻辑跟踪:

enter image description here

第一个字节不能正常工作的特写:

enter image description here

代码可以在 gitlab 上查看: https://gitlab.com/DanielBeyzade/stm32f107vc-home-control-master/blob/master/Src/flash.cpp

SPI的初始化代码可以在MX_SPI_Init()中看到

https://gitlab.com/DanielBeyzade/stm32f107vc-home-control-master/blob/master/Src/main.cpp

我在 SPI 总线上有另一个设备(RFM69HW RF 模块),它按预期发送和接收数据。

最佳答案

其实Craig Estey在他的回答中已经给出了解释。你确实有翻车。您写入整页,然后 - 无需循环 CS 引脚 - 您发送 INSTRUCTION_WRDI 命令。猜猜这个命令的二进制代码是什么?如果您猜到它是 4,那么您完全正确。

在这里检查你的代码:

    chipSelect();

_spi->transfer(INSTRUCTION_WRITE);
uint8_t xlow = address & 0xff;
uint8_t xhigh = (address >> 8);
_spi->transfer(xhigh); // part 1 address MSB
_spi->transfer(xlow); // part 2 address LSB


for (unsigned int i = 0; i < 64 && bytePos < dataLength; i++ )
{
uint8_t byte = ((uint8_t*)data)[bytePos];
_spi->transfer(byte);

// ...

bytePos ++;
}

_spi->transfer(INSTRUCTION_WRDI); // <-------------- ROLLOEVER!

chipUnselect();

对于这些设备,每个命令都必须以循环 CS 开头。 CS 变低后,第一个字节被解释为命令。所有剩余的字节 - 直到 CS 再次循环 - 都被解释为数据。因此,您不能在 CS 不断拉低的情况下在单个“ block ”中发送多个命令。

另一件事是您根本不需要 WRDI 命令 - 在写指令终止后(通过 CS 变高),WEL 位会自动重置。请参阅数据表第 18 页:

The Write Enable Latch (WEL) bit, in fact, becomes reset by any of thefollowing events:

• Power-up

• WRDI instruction execution

• WRSR instruction completion

• WRITE instruction completion.

关于c - M95128-W EEPROM。每页的第一个字节未正确写入或读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42374453/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com