读取序列号

该代码段展示了如何使用SPI接口与硬件交互进行闪存块读取操作,包括读取数据、等待空闲状态以及获取设备的序列号。在读取过程中,它处理了地址和数据缓冲区的细节,并在出现错误时提供调试信息。最后,将读取到的19字节序列号转换为QString并发送信号。
摘要由CSDN通过智能技术生成
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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值