就是只兔子 发表于 2022-11-11 16:33:03

SPI驱动W25Q中代码的问题

sf_ReadID() 函数
{
        g_spiLen = 0;
        g_spiTxBuf = (CMD_RDID);                                /* 发送读ID命令 */
        g_spiLen = 4;
        bsp_spiTransfer();       
        id1 = g_spiRxBuf;                                        /* 读ID的第1个字节 */
        id2 = g_spiRxBuf;                                        /* 读ID的第2个字节 */
        id3 = g_spiRxBuf;                                        /* 读ID的第3个字节 */
}
sf_EraseChip() 函数
{       
        g_spiLen = 0;
        g_spiTxBuf = CMD_BE;                                /* 发送整片擦除命令 */
        bsp_spiTransfer();
        sf_SetCS(1);                                                                        /* 禁能片选 */
}

        两个函数 g_spiLen = 0; 为啥要先设置为0? 发命令 ReadID中是g_spiTxBuf, EraseChip中确是g_spiTxBuf,有啥区别?
       传输完成后 第1个字节难道不是在g_spiRxBuf中吗? 而id1 = g_spiRxBuf?

eric2013 发表于 2022-11-12 09:56:32

1、bsp_spiTransfer(); 里面要用g_spiLen
2、这个是SPI全双工,发送命令CMD_RDID,也是有返回数据的,只是我们用不到这个,但是你DMA操作要把空间给出来。

就是只兔子 发表于 2022-11-12 09:58:55

自己回复下,请大佬们看看理解的是否正确
读取ID,返回的数据0位全部是HIGH,所以ID信息的第一个字节在g_spiRxBuf中,如图:但是先将g_spiLen 赋值0 还是不明白,直接赋值4不就可以了吗


就是只兔子 发表于 2022-11-12 10:02:39

首先,感谢硬汉哥的回复。
读ID信息时,发0x9F加24位地址,返回的ID信息是第1个字节高,后3个字节是ID信息了
只是不明白为啥要先g_spiLen = 0,直接给g_spiLen = 4,不可以吗

eric2013 发表于 2022-11-12 10:17:46

就是只兔子 发表于 2022-11-12 10:02
首先,感谢硬汉哥的回复。
读ID信息时,发0x9F加24位地址,返回的ID信息是第1个字节高,后3个字节是ID信息 ...

g_spiLen怎么玩都行,无需纠结,DMA操作的时候别设置错了就行。

就是只兔子 发表于 2022-11-12 10:30:01

eric2013 发表于 2022-11-12 10:17
g_spiLen怎么玩都行,无需纠结,DMA操作的时候别设置错了就行。

明白了,多谢:handshake:handshake:handshake

就是只兔子 发表于 2022-11-12 10:49:07

当看了sf_WriteEnable、sf_EraseChip、sf_EraseSector函数整体考虑了一下,明白g_spiLen = 0的含义了。
整体是为了保证各个函数的一致性,发送写使能、擦除等命令时,先将传输数据长度(g_spiLen )设为0,然后将传输数据数组的第0位写入命令的同时,令g_spiLen++;
这样调用bsp_spiTransfer()函数时,发送的数据就是命令,数据长度g_spiLen变为了1,也就是只是发1个字节的命令;
而由于sf_ReadID() 需要4个字节(1个字节命令+3个字节的地址),所以先将 g_spiLen = 0,就没用自加了,直接赋值给了4( g_spiLen = 0)
这个语句也可以改为:
g_spiLen = 0;
g_spiTxBuf =(CMD_RDID);
g_spiTxBuf =0x00;
g_spiTxBuf =0x00;
g_spiTxBuf =0x00;
bsp_spiTransfer();
也就是发4个字节的数据(g_spiLen++了四次),一个字节的命令+三个字节的地址。

硬汉哥的函数通用性真好,需要多看几个函数就明白了,多谢:)
页: [1]
查看完整版本: SPI驱动W25Q中代码的问题