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

//-----------------------------------------------------------------------------//函数描述... //-----------------------------------------------------------------------------
//函数描述: SPI写函数
//相关参数:
//返回信息:
//
//-----------------------------------------------------------------------------
void SpiWriteRegister (uchar reg, uchar value)
{
RF_NSEL = 0; //Select the radio by pulling the nSEL pin to low
SPI0DAT = (reg|0x80); //write the address of the register into the SPI buffer of the MCU
while( SPIF == 0); //wait until the MCU finishes sending the byte
SPIF = 0;
SPI0DAT = value; //write the new value of the radio register into the SPI buffer of the MCU.
while( SPIF == 0); //wait until the MCU finishes sending the byte.
SPIF = 0;
RF_NSEL = 1; //Deselect the radio by pulling high the nSEL pin.
}

//-----------------------------------------------------------------------------
//函数描述: SPI读取函数
//相关参数:
//返回信息:
//
//-----------------------------------------------------------------------------
uchar SpiReadRegister (uchar reg)
{
RF_NSEL = 0; //Select the radio by pulling the nSEL pin to low
SPI0DAT = reg; //Write the address of the register into the SPI buffer of the MCU, write data into the SPI register
while( SPIF == 0); //Wait untill the MCU finishes sending the byte
SPIF = 0;
SPI0DAT = 0xFF; //write dummy data into the SPI register. During sending this byte the MCU will read the value of the
//radio register and save it in its SPI buffer. Wait untill the MCU finishes sending the byte.
while( SPIF == 0);
SPIF = 0;
RF_NSEL = 1; //Deselect the radio by pulling high the nSEL pin
return SPI0DAT; //Read the received radio register value and return with it
}
展开
 我来答
ivyxtvv
推荐于2017-11-25 · TA获得超过1177个赞
知道小有建树答主
回答量:78
采纳率:0%
帮助的人:94.5万
展开全部
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的控制下,两个双向移位寄存器进行数据交换,所以它是一边发送一边接收,你想接收一个自己数据,就要先发送一个字节数据。因为这样才产生时钟信号,数据才从从机发送出来;也因此,写入时交换来的数据是无效的,读取时写入的数据是无效的。读写的具体区别,要看你单片机的芯片手册了,一般是没有区别的,读写甚至可以写成一个函数。。。
gerrardlink
2013-01-04 · 超过18用户采纳过TA的回答
知道答主
回答量:61
采纳率:0%
帮助的人:51万
展开全部
读写的操作都是基于你发给从设备一个地址,但是从设备区分你是读操作还是写操作一般就是通过你发过去的地址值,所以看上去都是写,其实,区别在于你写的这个地址值是用来读的还是写的...(不管你读还是写,总得告诉对面地址吧,所以要先写个地址发过去)
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式