int NVM_FControl::FlashBlockRead(long long address, long long len, uchar *Buf)
{
long long BlockSize = 0x0100; //256B
int cWriteSize = 4;
int cReadSize = (int)BlockSize;
uchar sendBuf [260]; /// 在QT中,数组后面的【】必须是实数,所以要算出来加上用
uchar recvBuf [260]; 原本是0x0100+4
int ret = m_Cypress.Open_SPI(1);
if(ret<0)
{
return -1;
qDebug()<<"open spi error";
}
long long str_addr = address;
while (len > 0)
{
sendBuf[0] = READ_DATA;
sendBuf[1] = (address >> 16 & 0xff);
sendBuf[2] = (address >> 8 & 0xff);
sendBuf[3] = (address & 0xff);
cWriteSize = 4;
if (len > BlockSize)
cReadSize = (int)BlockSize;
else
cReadSize = (int)len;
ret = m_Cypress.ReadWrite_SPI(recvBuf,sendBuf, 260);
if (ret < 0)
{
return ret;
qDebug()<<"write read spi error";
}
for (int i = 0; i < cReadSize; i++)
Buf[address - str_addr + i] = recvBuf[cWriteSize + i];
ret = FlashWaitIdle();
if (ret < 0)
{
return -3;
qDebug()<<"FlashWaitIdle";
}
address += BlockSize;
if (len > BlockSize)
len -= BlockSize;
else
len = 0;
}
ret = m_Cypress.Close_SPI();
if(ret<0)
{
return -4;
qDebug()<<"close spi error";
}
return 0;
}
int NVM_FControl::FlashWaitIdle()
{
uchar sendBuf [2];
uchar recvBuf [2];
int ret;
do
{
sendBuf[0] = READ_STATUS1;
ret = m_Cypress.ReadWrite_SPI(recvBuf, sendBuf, 2);
if (ret < 0)
{
return -6;
qDebug()<<"write read spi error";
}
}
while ((recvBuf[1] & 0x03) > 0);
return 0;
}
int NVM_FControl::GetSerialNumber(QString &serialNumber)
{
long long snLength = 19;
uchar sn[19];
int ret;
ret = FlashBlockRead(0, snLength, sn);
if (ret < 0)
{
serialNumber = "error";
return ret;
qDebug()<<"get serialnumber error";
}
//把19个数组转换成QString!!!!!!!!!!!!!!!!!!!!!
serialNumber = QString::fromUtf8(reinterpret_cast<char *>(sn),19);
qDebug()<<"serialNumber"<<serialNumber;
//Console.WriteLine("6540 : " + serialNumber);
emit logout(QString("Set serialNumber %1").arg(serialNumber));
return 0;
}
读取序列号
最新推荐文章于 2024-10-08 00:02:21 发布
该代码段展示了如何使用SPI接口与硬件交互进行闪存块读取操作,包括读取数据、等待空闲状态以及获取设备的序列号。在读取过程中,它处理了地址和数据缓冲区的细节,并在出现错误时提供调试信息。最后,将读取到的19字节序列号转换为QString并发送信号。
摘要由CSDN通过智能技术生成