看了王珏的本科毕业论文,才算在没有任何实践的情况下搞清楚总线协议和CMU的IO端口的关系。原来这才是我要找的东西,原先的资料太多和杂,实在是太概念。
现在明白为什么可以用C编程控制CMU了。以下转载自王珏的毕业论文:
1.I2C总线及其工作原理
微控制器和各种传感器的通信一般是通过I2C 总线(Inter-IntegratedCircuit)。
I2C 串行总线一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL。I2C 的工作原理如图所示,主机在SCL 线上产生自己的时钟来传输I2C 总线上的数据,数据只在时钟的高电平周期有效,每传输一个数据位就产生一个时钟脉冲,数据线的高或低电平状态只有在SCL 线的时钟信号是低电平时才能改变,当SCL 为高电平时,SDA 的改变表示“开始”和“停止”状态,即SDA 由高电平转入低电平表示开始,该命令必须在其它命令前执行;SDA 由低电平转入高电平表示停止状态,该命令可终止所有通讯。
在开始条件后,SCL 低电平期间,SDA 允许变化,每位数据需一个时钟脉冲,当SCL 为高时,SDA 必须稳定,主控器在应答时钟脉冲高电平期间释放SDA 线,转由接收器控制。相同总线上的设备在收到数据后,以置SDA 为低电平的方式对其确认。总线不忙时,数据线和时钟线保持为高电平。
仿真:
用keil C语言写出I2C总线传输的代码,编译通过后写入MCU的程序ROM中,测试是否能按照总线的协议正常工作。
首先,对MC8051 的端口加以命名:
Sbit sda=P1^7
Sbit scl=P1^6
启动函数:在SCL 为高时,给出SDA 的下降沿,即为启动信号。
停止函数:在SCL 为高时,给出SDA 的上升沿,即为停止信号。
发送函数:向I2C 总线写数据,每次写8 位。首先拉低SCL,然后使发送数据左移,用SDA 发送一位数据,再拉高SCL 以给出上升沿,发出SDA的状态值。
接受函数:从I2C 总线读数据,每次读8 位。首先拉高SCL,然后接受值左移一位把低位和SDA 相或得到SDA 的状态值,再拉低SCL 以给出下降沿。
举例说明:利用MCU 程序控制传送数据12,二进制表示为00001100。Modelsim 的仿真结果如图所示,可见sda 即P1[7]上传输数据,scl 即P1[6]上的状态改变控制了时钟,时序与协议要求完全符合。
2.SPI总线及其工作原理
微控制器和无线收发器模块的通信一般是通过SPI 总线(Serial Peripheral interface)。
SPI 就是串行外围设备接口,是一种高速的、全双工、同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB 的布局上节省空间,提供方便。
该接口一般使用4 条线:串行时钟线(SCK)、主机输入/从机输出数据线MISO、主机输出/从机输入数据线MOSI 和低电平有效的从机选择线SS(有的SPI 接口芯片带有中断信号线INT 或INT、有的SPI 接口芯片没有主机输出/从机输入数据线MOSI)。
SPI 的工作模式有两种:主模式和从模式,无论那种模式,都支持3Mbit/s的速率,并且还具有传输完成标志和写冲突保护标志。
仿真:
对于不带SPI 串行总线接口的MC8051 来说,可以使用软件来模拟SPI的操作,包括串行时钟、数据输入和数据输出。对于不同的串行接口外围芯片,它们的时钟时序是不同的。
用keil C 语言写出I2C总线传输的代码,编译通过后写入MCU 的程序ROM 中,测试是否能按照总线的协议正常工作。
首先,对MC8051 的端口加以命名:
Sbit MISI=P1^0
Sbit MISO=P1^3
Sbit SCK=P1^1
Sbit SS=P1^2
发送函数:向SPI 总线写数据,每次写8 位。首先拉低SCK,然后使发送数据左移,用MISI发送一位数据,再拉高SCL 以给出时钟的上升沿以发出数据。
接受函数:从SPI 总线读数据,每次读8 位。首先拉低SCK,然后接受值左移一位把低位和MISO相或得到接受数据该位的状态值,再拉高SCL以给出上升沿。
举例说明:利用MCU 程序控制传送数据23,二进制表示为00010111。Modelsim 的仿真结果如图所示,SCK 即P1[1]上产生的是串行时钟信号,SS 即P1[2]上产生片选信号。此时情况为发送信号,而MCU为主机,因此MISI即P1[0]上的信号是主机输出即MCU 发送的数据,而MISO 即P1[3]上没有信号的变化。
阅读(8841) | 评论(5) | 转发(2) |