spi读第一个数据为0

spi读第一个数据为0,第1张

spi读第一个数据为0原因硬件设计和程序有问题。解决方法散培上位机将需要的页号或多个页号发给ST三十二,ST三十二启动SP *** 作,逐页读取,并采取先神宴进先出的方式保冲瞎唯存在一个FIFO缓冲区中,该缓冲区以页大小为单位,通过串口拼包发出。

1、SPTAT=0xc0之后SPIF是不是等于零。如Datasheet,是的。置1清零。

2、SPDAT = SPDAT两个形式相同,含义却不同。因为发送缓冲和接收缓冲,一个只写,一个只读。所衡戚以,没有必要安排两个寄存器分别存放。而是复用了一个地哪敬址。左咐缓陵边的是发送缓冲,可以被赋值,如SPDAT =0x11表示发数据0x11。右边的是接收缓冲,如i=SPDAT表示接收到的内容读取到i变量中。=赋值语句,是有要求的,左边和右边是不同的。比如0=i就是不合法的。这样你能理解了为什么是SPDAT = SPDAT了吧。就是把收到的内容再写到发缓冲的意思。

void SpiWriteRegister (uchar reg, uchar value)

{

RF_NSEL = 0 // 片选拉低启动SPI通讯

SPI0DAT = (reg|0x80) // 写入1个字节的寄存器地址

while( SPIF == 0) // 等待SPI传输完成

SPIF = 0

SPI0DAT = value // 继续写入第二个字节(寄存器值)

while( SPIF == 0) // 等待SPI传输完成

SPIF = 0

RF_NSEL = 1 // 片选拉高结束SPI通讯

}

//-----------------------------------------------------------------------------

//函数描述: SPI读取函数

//相关参数:

//返回信息:

//

//-----------------------------------------------------------------------------

uchar SpiReadRegister (uchar reg)

{

RF_NSEL = 0// 片选拉低启动SPI通讯

SPI0DAT = reg // 写入1个字节的寄存器地址

while( SPIF == 0) // 等待SPI传输完成

SPIF = 0

SPI0DAT = 0xFF // 写一个Dummy字节(因为要读取的话必须用写入来启动一个交换数据的传输),当写入完成后从机的数据也完成了读入。

while( SPIF == 0) // 等待SPI传输配段完成

SPIF = 0

RF_NSEL = 1 // 片选拉高结束SPI通讯

return SPI0DAT// 返回读取的值(在SPI0DAT=0xFF中完成读取)

}

需要注意的是读写 *** 作实际上完成的都是数据的交换,即主机传送1个字节给从机,从机同时传送1个字节给主机。所以读 *** 作看起来像是写数据,但实际上培没誉写入完成后就可以从SPI0DAT中获得从机的察销应答数据了。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12314921.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存