stm32的SPI发送接收的问题

[复制链接]
8386|7
 楼主| dong130300 发表于 2012-4-22 08:33 | 显示全部楼层 |阅读模式
数据手册上说,当SPI发送完一个数据之后会返回一个数据,数据的发送和接收是同步的,那如果我在SPI的发送函数中发送一个其他芯片寄存器的地址,那么返回的应该是一个什么值
如果我在发送函数中发送0,那么得到的值,是不是就相当于是读这个寄存器的数据
u8 SPI_Send_Byte(u8 dat)
{
/* Loop while DR register in not emplty */
while(SPI_GetFlagStatus(SPI2, SPI_FLAG_TXE) == RESET);

/* Send byte through the SPI2 peripheral */
SPI_SendData(SPI2, dat);

/* Wait to receive a byte */
while(SPI_GetFlagStatus(SPI2, SPI_FLAG_RXNE) == RESET);

/* Return the byte read from the SPI bus */
return SPI_ReceiveData(SPI2);
}
这是发送函数,如果reg是一个外围芯片的寄存器地址那么u8 SPI_Send_Byte(reg)返回的是什么值
u8 SPI_Send_Byte(0)返回的是什么值
airwill 发表于 2012-4-22 09:10 | 显示全部楼层
返回的是什么值,
1. 取决于你的连接, MISO 有没有连接到适当的返回信号上;
2. 取决于那个相连接的外设或器件. 你应该找 SPI 相连的那个器件资料.
 楼主| dong130300 发表于 2012-4-22 10:15 | 显示全部楼层
**作的是nrf24l01, 我看了别人写的一个程序

u8 SPI_Read_Buf(u8 reg, u8 *pBuf, u8 Len)
{
        uint status,i;
       
        CSN_L();                                    // Set CSN low, init SPI tranaction
        status = SPI_Send_Byte(reg);      
       
  for(i=0;i<Len;i++)
  {
     pBuf[i] = SPI_Send_Byte(0);
  }
       
        CSN_H();                           
       
        return(status);                    // return nRF24L01 status u8
}
这里是SPI读数据的程序,我感觉status = SPI_Send_Byte(reg); 是为了找到寄存器的地址, SPI_Send_Byte(0); 是为了将寄存器中的数据读出,但我不知道返回值为什么是status,我感觉应该是pbuf[i]啊,我感觉操作NRF24l01不是很容易啊
acgean 发表于 2012-4-23 08:26 | 显示全部楼层
同意二楼的分析,返回值该是什么, 还是看 nRF24L01 资料上的说明吧。
LAORUAN 发表于 2012-4-23 12:00 | 显示全部楼层
支持二楼。
jinguoju 发表于 2012-4-23 22:25 | 显示全部楼层
二楼说的很对,我之前用过芯科的芯片,你LZ分析的那样。
香水城 发表于 2012-4-24 09:53 | 显示全部楼层
请LZ先学习一下什么是SPI,SPI的工作原理是什么。你的问题表明你没有这些基础知识。
lllaaa 发表于 2012-4-24 11:06 | 显示全部楼层
本帖最后由 lllaaa 于 2012-4-24 11:07 编辑

SPI master slave各有一个8bit位移寄存器。master通过MOSI向slave写入8bit数据的时候,会把slave上面位移寄存器的值一个bit一个bit的挤到MISO这条线上来。从而读取到slave上面那个寄存器的值。所以一般读取的时候会写个无关紧要的值0xff。
所以spi的读写是同步进行的。要读数据必须用另一个数据去挤出来。

评分

参与人数 1威望 +2 收起 理由
香水城 + 2 基础很重要!

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

35

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部