Chinaunix首页 | 论坛 | 博客
  • 博客访问: 955057
  • 博文数量: 116
  • 博客积分: 3923
  • 博客等级: 中校
  • 技术积分: 1337
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-23 01:22
文章分类

全部博文(116)

文章存档

2013年(1)

2012年(17)

2011年(69)

2009年(29)

分类:

2009-08-25 00:15:23

工程描述:由于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) |
给主人留下些什么吧!~~