工程描述:由于LM3S1601只有2个串口模块,实际应用中缺少一个串口,所以使用廉价的51来实现uart接受模拟到i2c信号发送的模拟,然后通过跟LM3S1601的i2c模块来接受数据。
(1)LM3S1601这边的工作主要有3个:
(1.1) 实现uart打印驱动,目的是用来测试从I2C读取的数据是否正确。
(1.2) 实现I2C数据的接收驱动。
(1.3) 实现gpio_b_1的触发。
(2)参数配置:
(2.1)uart: 9600波特率 无流控制 8位数据位 无校验
(2.2)I2C : 100kbps
(3)分析:
(3.1)由于uart设置为9600波特率,也就是说1.2byte/ms, 而 I2C 是 100kbps ,即12.8byte/ms. 由于那边的uart中断是微妙级,按理来说是可行的。
(4)LM3S1601实现I2C的接收驱动, gpio_b_1触发开始/暂停驱动,和 uart发送驱动。
(4.1)GPIO_B_1是工作原理是:当模拟的51芯片把GPIO_B_1拉高时,在上升缘触发中断。 当模拟的51芯片发送完缓冲里的数据,就把GPIO_B_1拉底实现这-次数据发送完毕。
(4.2)I2C的接收驱动原理是: 设置MASTER模式,提供准确的CLK信号,因为如果交给51芯片来模拟CLK是吃不消的。在处理GPIO_B_1的中断里触发I2C的接收,I2C接收也采用中断处理,
I2C设置为burst receive 模式来接受数据, 中断处理的过程如下:
检查I2CMCS(I2C Master Control/Status)的BUSY位,如果忙就退出,因为这位如果忙就不能读取其他的错误状态位,这样就不知道当前中断是错误引起的中断,还是接收完成
引起的中断,然后判断是ADRACK(Acknowledge Address)位,如果置1就直接发送STOP信号(go to idle state),否则接收数据,不断把数据放置在一个128byte的缓冲里。Ri索引
每接收到一个字节就加1,当超过128个就重设置为0(从头开始,环形的缓冲)。然后发信号量给uart驱动来打印数据出来。
(注意:当发送finish信号时,当前中断结束后还要处理一个中断,然后才直接SCL,SCA引脚变高,才表示结束STOP信号)
(4.3)uart的发送驱动原理:uart打印也是通过中断处理,当有信号量接收到来时,就触发uart发送函数,但Ro索引不等于Ri索引时,一直打印,如果大于128,就重设为0从头开始。
实现了跟I2C接收驱动的异步打印机制。这样就尽量把I2C的中断处理时间减到最少。
阅读(2113) | 评论(0) | 转发(0) |