帮忙分析一个这个spi读写程序,详细一点的,解释一下。怎么觉得读和写的内容怎么差不多呢,怎么实现的读写
答案:2 悬赏:40 手机版
解决时间 2021-03-15 21:25
- 提问者网友:ミ烙印ゝ
- 2021-03-15 18:12
帮忙分析一个这个spi读写程序,详细一点的,解释一下。怎么觉得读和写的内容怎么差不多呢,怎么实现的读写
最佳答案
- 五星知识达人网友:迟山
- 2021-03-15 18:18
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中获得从机的应答数据了。追问后面仔细看了下函数注释,好像就是这么个意思。不过我不明白为什么spi的读函数要写空字节呢,这个是c8051f330的单片机,从机是si4432。还有spi的读和写的区别是因为这个么:SPI0DAT = (reg|0x80); (写) ////SPI0DAT = reg;(读)。是因为寄存器地址是7位,二进制形式下最高位是0,SPI0DAT = (reg|0x80); 把最高位强制置1,SPI0DAT = reg;最高位0,执行读操作。是这样么?还有您懂不懂crc检测?追答SPI是一个环形总线结构,在sck的控制下,两个双向移位寄存器进行数据交换,所以它是一边发送一边接收,你想接收一个自己数据,就要先发送一个字节数据。因为这样才产生时钟信号,数据才从从机发送出来;也因此,写入时交换来的数据是无效的,读取时写入的数据是无效的。读写的具体区别,要看你单片机的芯片手册了,一般是没有区别的,读写甚至可以写成一个函数。。。
{
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中获得从机的应答数据了。追问后面仔细看了下函数注释,好像就是这么个意思。不过我不明白为什么spi的读函数要写空字节呢,这个是c8051f330的单片机,从机是si4432。还有spi的读和写的区别是因为这个么:SPI0DAT = (reg|0x80); (写) ////SPI0DAT = reg;(读)。是因为寄存器地址是7位,二进制形式下最高位是0,SPI0DAT = (reg|0x80); 把最高位强制置1,SPI0DAT = reg;最高位0,执行读操作。是这样么?还有您懂不懂crc检测?追答SPI是一个环形总线结构,在sck的控制下,两个双向移位寄存器进行数据交换,所以它是一边发送一边接收,你想接收一个自己数据,就要先发送一个字节数据。因为这样才产生时钟信号,数据才从从机发送出来;也因此,写入时交换来的数据是无效的,读取时写入的数据是无效的。读写的具体区别,要看你单片机的芯片手册了,一般是没有区别的,读写甚至可以写成一个函数。。。
全部回答
- 1楼网友:躲不过心动
- 2021-03-15 18:41
读写的操作都是基于你发给从设备一个地址,但是从设备区分你是读操作还是写操作一般就是通过你发过去的地址值,所以看上去都是写,其实,区别在于你写的这个地址值是用来读的还是写的...(不管你读还是写,总得告诉对面地址吧,所以要先写个地址发过去)
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯