样列代码分析
这处的代码是 实例 SPI MASTER
///< 片选,开始通讯
Spi_SetCS(M0P_SPI0, FALSE);
///< 主机向从机发送数据
while(tx_cnt<10) //主机发送数据给从机
{
while(Spi_GetStatus(M0P_SPI0, SpiTxe) == FALSE); //等待发送缓冲器空
Spi_SendData(M0P_SPI0, tx_buf[tx_cnt++]);
}
///< 主机接收从机数据
while(rx_cnt<10) //接收从机的数据
{
while(Spi_GetStatus(M0P_SPI0, SpiTxe) == FALSE); //等待发送缓冲器空
Spi_SendData(M0P_SPI0, 0); //发送空数据
delay10us(20);
while(Spi_GetStatus(M0P_SPI0, SpiRxne) == FALSE);
rx_buf[rx_cnt++] = Spi_ReceiveData(M0P_SPI0);
}
///< 结束通信
Spi_SetCS(M0P_SPI0, TRUE);
他所给的代码是两个单片机互相SPI通信 一个为master,一个为slave。我没有实测。
1、可以得出关键点接收数据必须延时,实测延时delay10us(1);可以,不过偶尔不行,我设的delay10us(2);
2、以下分析RC520通信SPI
2.1得到RC520寄存器数据步骤:
///< 片选,开始通讯
Spi_SetCS(M0P_SPI0, FALSE);
while(Spi_GetStatus(M0P_SPI0, SpiTxe) == FALSE); //等待发送缓冲器空
Spi_SendData(M0P_SPI0, 地址);
while(Spi_GetStatus(M0P_SPI0, SpiTxe) == FALSE); //等待发送缓冲器空
Spi_SendData(M0P_SPI0, 0); //发送空数据
delay10us(20);
while(Spi_GetStatus(M0P_SPI0, SpiRxne) == FALSE);
数据 = Spi_ReceiveData(M0P_SPI0);
///< 结束通信
Spi_SetCS(M0P_SPI0, TRUE);
2.2写数据到RC520寄存器
///< 片选,开始通讯
Spi_SetCS(M0P_SPI0, FALSE);
while(Spi_GetStatus(M0P_SPI0, SpiTxe) == FALSE); //等待发送缓冲器空
Spi_SendData(M0P_SPI0, 地址);
while(Spi_GetStatus(M0P_SPI0, SpiTxe) == FALSE); //等待发送缓冲器空
Spi_SendData(M0P_SPI0, 数据); //
///< 结束通信
Spi_SetCS(M0P_SPI0, TRUE);
|