您好!欢迎来到信盈达产学合作协同育人平台|校企合作|嵌入式培训|解决方案|

登录 注册 微信快速登录

扫一扫看效果 关闭

好文章,欢迎分享给朋友

xydxx

01-16 16:47    浏览1762

1.1 模拟SPI1.1.1 模拟SPI的管脚配置

模拟SPI就是通过GPIO口拉高拉低来实现数据传输。在配置模拟SPI时,管脚配合如下:
1) SCK管脚配置为推挽输出。SCK的时钟是通过GPIO口拉高拉低来产生。
2) MOSI管脚配置为推挽输出。MOSI发送数据“1”,是通过将MOSI管脚输出高电平来实现;MOSI发送数据“0”,是通过将MOSI管脚输出低电平来实现。
3) MISO配置上拉输入。如果MISO输入的数据是0,则表示接收到的数据位是0;如果MISO输入的数据是1,则表示接收到的数据位是1
1.1.2 模拟SPI数据交换过程
举例:以时钟模式0位例子,假设发送接收的数据都是8位的,通过GPIO模拟数据交换的过程。
1) 在时钟低电平是准备MOSI数据
2) 在时钟上升沿时发送MOSI数据
3) 在时钟高电平读取MISO数据
不管是SPI主机还是SPI从机都必须遵循以上规则。对于SPI主机来说,上述的1个数据位的交换过程如下:
2 主机在时钟低电平是准备MOSI数据
2 主机准备的数据在时钟上升沿被发送出去,通过MOSI发送输出
2 主机在时钟高电平时,同时读取来自于从机的数据,通过MISO读取。
这个过程如果重复8次,那么就可以实现发送8位数据,且接收到8位数据。
 
1.1.3 模拟SPI的伪代码
//data:待发送的数据
//返回值:是接收到的数据
u8  SPI_SendReceiveData(u8 data)
{
       u8 recvData = 0;  //接收到的数据
       for(i=0;i<8;i++)
       {
               SCK_L;  //时钟低电平
               //主机在时钟低电平是准备MOSI数据
               if((data>>(7-i))&0x01)  //从最高位开始发送
               {
                       //要发送的数据位是1
                       MOSI_H;
               }
               else
               {
                       //要发送的数据位是0
                       MOSI_L;
               }
               //主机准备的数据在时钟上升沿被发送出去,通过MOSI发送输出
               SCK_H;  
               //主机在时钟高电平时,同时读取来自于从机的数据,通过MISO读取。
               //最先接收到的是最高位
               recvData= recvData<< 1;
               if(如果MISO输入的数据是1)
               {
                       recvData |= 1<<0;
               }
               else
               {
                       //MISO接收到的数据是0
                       recvData &=~(1<<0);
               }
       }
       SCK_L;  //时钟低电平,时钟空闲
       return recvData;
}


评论0 0
评论
内容加载中……,请稍候!

手指长按二维码,快速关注

给TA留言
留言
返回
评论