帮忙分析一个这个spi读写程序,详细一点的,解释一下。怎么觉得读和写的内容怎么差不多呢,怎么实现的读写

帮忙分析一个这个spi读写程序,详细一点的,解释一下。怎么觉得读和写的内容怎么差不多呢,怎么实现的读写,第1张

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中获得从机的应答数据了。

1:SPI是一种高速,全双工的,同步的通信总线;

2:四线连接,MISO-主设备数据输入,从设备数据输出;MOSI-主设备数据输出,从设备数据输入;SCLK-时钟信号,由主设备产生;CS-从设备片选信号,由主设备控制。

3:主机和从机各有一个串行移位寄存器,两个寄存器中的数据在同一时刻被交换,如果只进行写 *** 作,主机只需要忽略接收到的字节;如果主机要读取从机中的字节,就必须发送一个空字节来引发从机的传输。

4:SPI可以设置输出串行时钟的极性和相位,时钟极性与串行同步时钟的空闲状态的电平有关,CPOL=0,串行同步时钟空闲状态为低电平,反之为高;CPHA可以设置选择两种不同的传输协议,CPHA=0,串行同步时钟的第一个跳边沿数据被采样,反之,在串行同步时钟的第二个跳边沿数据被采样;

5:为了防止MISO总线冲突,同一时间只允许一个从设备与主设备通讯;

6:SPI主机和从机的时钟极性和相位应该一致;

7:在数据传输(数据交换)的过程中,每次接收到的数据必须在下一次数据传输之前被采样.如果之前接收到的数据没有被读取,那么这些已经接收完成的数据将有可能会被丢弃,导致SPI物理模块最终失效。因此,在程序中一般都会在SPI传输完数据后,去读取SPI设备里的数据,即使这些数据(DummyData)在我们的程序里是无用的。

1:概述

2:时序

1:配置相关引脚复用为SPI,使能SPI时钟;

2:设置SPI工作模式,包括主机或者从机、数据格式(高位在前还是低位在前)、设置串行时钟的极性和相位(采样方式)、SPI时钟频率(SPI的传输速度);

3:使能SPI;

spi.c-SPI驱动

flash.c-w25q128驱动


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存