大家帮我看下我的I2C时序

[复制链接]
3114|9
 楼主| liulicau 发表于 2007-10-26 10:07 | 显示全部楼层 |阅读模式
#define&nbsp;YANSHI&nbsp;60<br />void&nbsp;delay&nbsp;(uint32&nbsp;i)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;while(--i);<br />}<br /><br />void&nbsp;Start_I2c()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;IO0DIR=(IO0DIR&0xfffffff7)|0x00000008;//SDA输出<br />&nbsp;&nbsp;&nbsp;&nbsp;IO0SET=(IO0PIN&0xfffffff7)|0x00000008;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//SDA置1<br />&nbsp;&nbsp;&nbsp;&nbsp;delay(YANSHI);<br />&nbsp;&nbsp;&nbsp;&nbsp;IO0SET=(IO0PIN&0xfffffffb)|0x00000004;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//SCL置1<br />&nbsp;&nbsp;&nbsp;&nbsp;delay(YANSHI);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IO0CLR=(IO0PIN&0xfffffff7)|0x00000008;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//SDA置0<br />&nbsp;&nbsp;&nbsp;&nbsp;delay(YANSHI);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IO0CLR=(IO0PIN&0xfffffffb)|0x00000004;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//SCL置0<br />&nbsp;&nbsp;&nbsp;&nbsp;delay(YANSHI);<br />}<br />void&nbsp;Stop_I2c()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;IO0DIR=(IO0DIR&0xfffffff7)|0x00000008;//SDA输出<br />&nbsp;&nbsp;&nbsp;&nbsp;IO0CLR=(IO0PIN&0xfffffff7)|0x00000008;//SDA置0<br />&nbsp;&nbsp;&nbsp;&nbsp;delay(YANSHI);<br />&nbsp;&nbsp;&nbsp;&nbsp;IO0CLR=(IO0PIN&0xfffffffb)|0x00000004;<br />&nbsp;&nbsp;&nbsp;&nbsp;delay(YANSHI);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IO0SET=(IO0PIN&0xfffffffb)|0x00000004;//SCL置1<br />&nbsp;&nbsp;&nbsp;&nbsp;delay(YANSHI);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IO0SET=(IO0PIN&0xfffffff7)|0x00000008;//SDA置1<br />&nbsp;&nbsp;&nbsp;&nbsp;delay(YANSHI);<br />}<br />/***********************************<br />字节数据传送函数<br />函数原理:void&nbsp;SendByte(uchar&nbsp;c);<br />功能:将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对此状态位进行操作(不应答或非应答都使ack=0&nbsp;假)。<br />发送数据正常,ack=1;ack=0表示被控器无应答或损坏。<br />****************************************/<br />void&nbsp;SendByte(uint8&nbsp;c)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;uint8&nbsp;BitCnt;<br />&nbsp;&nbsp;&nbsp;&nbsp;IO0DIR=(IO0DIR&0xfffffff7)|0x00000008;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//SDA输出<br />&nbsp;&nbsp;&nbsp;&nbsp;for(BitCnt=0;BitCnt&lt8;BitCnt++)<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((c&0x80)==0x80)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IO0SET=(IO0PIN&0xfffffff7)|0x00000008;//SDA置1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IO0CLR=(IO0PIN&0xfffffff7)|0x00000008;//SDA置0<br />&nbsp;&nbsp;&nbsp;&nbsp;delay(YANSHI);<br />&nbsp;&nbsp;&nbsp;&nbsp;IO0SET=(IO0PIN&0xfffffffb)|0x00000004;&nbsp;&nbsp;&nbsp;&nbsp;//SCL置1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delay(YANSHI);<br />&nbsp;&nbsp;&nbsp;&nbsp;IO0CLR=(IO0PIN&0xfffffffb)|0x00000004;&nbsp;&nbsp;&nbsp;&nbsp;//SCL置0<br />&nbsp;&nbsp;&nbsp;&nbsp;c=c&lt&lt1;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;delay(YANSHI);<br />&nbsp;&nbsp;&nbsp;&nbsp;IO0SET=(IO0PIN&0xfffffff7)|0x00000008;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//SDA置1<br />&nbsp;&nbsp;&nbsp;&nbsp;delay(YANSHI);<br />&nbsp;&nbsp;&nbsp;&nbsp;IO0SET=(IO0PIN&0xfffffffb)|0x00000004;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//SCL置1<br />&nbsp;&nbsp;&nbsp;&nbsp;delay(YANSHI);<br />&nbsp;&nbsp;&nbsp;&nbsp;IO0DIR=(IO0DIR&0xfffffff7);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//SDA输入<br />&nbsp;&nbsp;&nbsp;&nbsp;delay(YANSHI);<br />&nbsp;&nbsp;&nbsp;&nbsp;sda_value=IO0PIN;<br />&nbsp;&nbsp;&nbsp;&nbsp;if((IO0PIN&0x00000008)==0x00000008)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ack=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;ack=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;IO0CLR=(IO0PIN&0xfffffffb)|0x00000004;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//SCL置0<br />&nbsp;&nbsp;&nbsp;&nbsp;delay(YANSHI);<br />}<br />/*****************************************<br />字节数据传送函数<br />函数原形:uchar&nbsp;RcvByte();<br />功能:用来接收从器件传来的数据,并判断总线错误(不发应答信号),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;发完后请用应答函数。<br />*******************************************/<br />uint8&nbsp;RcvByte()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;uint8&nbsp;retc;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint8&nbsp;BitCnt;<br />&nbsp;&nbsp;&nbsp;&nbsp;retc=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;IO0DIR=(IO0DIR&0xfffffff7)|0x00000008;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//SDA输出<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IO0SET=(IO0PIN&0xfffffff7)|0x00000008;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//SDA置1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IO0DIR=(IO0DIR&0xfffffff7);//SDA输入<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(BitCnt=0;BitCnt&lt8;BitCnt++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delay(YANSHI);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IO0CLR=(IO0PIN&0xfffffffb)|0x00000004;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//SCL置0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delay(YANSHI);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IO0SET=(IO0PIN&0xfffffffb)|0x00000004;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//SCL置1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delay(YANSHI);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;retc=retc&lt&lt1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((IO0PIN&0x00000008)==0x00000008)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;retc=retc+1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delay(YANSHI);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;IO0CLR=(IO0PIN&0xfffffffb)|0x00000004;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//SCL置0<br />&nbsp;&nbsp;&nbsp;&nbsp;delay(YANSHI);<br />&nbsp;&nbsp;&nbsp;&nbsp;return(retc);<br />}<br />/*******************************************<br />应答子函数<br />原形:viod&nbsp;Ack_I2c(bit&nbsp;a);<br />功能:主控器进行应答信号,(可以是应答或非应答信号)<br />**********************************************/<br />void&nbsp;Ack_I2c(uint8&nbsp;a)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IO0DIR=(IO0DIR&0xfffffff7)|0x00000008;//SDA输出<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(a==1)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IO0SET=(IO0PIN&0xfffffff7)|0x00000008;//SDA置1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IO0CLR=(IO0PIN&0xfffffff7)|0x00000008;//SDA置0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delay(YANSHI);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IO0SET=(IO0PIN&0xfffffffb)|0x00000004;//SCL置1<br />&nbsp;&nbsp;&nbsp;&nbsp;delay(YANSHI);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IO0CLR=(IO0PIN&0xfffffffb)|0x00000004;//SCL置0<br />&nbsp;&nbsp;&nbsp;&nbsp;delay(YANSHI);<br />}<br /><br />
ayb_ice 发表于 2007-10-26 11:05 | 显示全部楼层

LPC2000系列不是有硬件IIC吗?

  
 楼主| liulicau 发表于 2007-10-26 12:15 | 显示全部楼层

我用那个总是不行,所以换自己写的模拟的试一下

能看出我这个程序有啥问题吗?
yczhang 发表于 2007-10-26 14:03 | 显示全部楼层

能用吗?

  
ayb_ice 发表于 2007-10-26 15:11 | 显示全部楼层

可读性太差,都没有看完

  
NE5532 发表于 2007-10-26 20:16 | 显示全部楼层

老大,你不会用宏定义啊?

  
展翅鹏飞 发表于 2007-10-28 22:02 | 显示全部楼层

的确太长了

IIC程序已经有很多可参考的程序了,咋写这么长呢?有什么特殊要求吗?
fanguang 发表于 2007-11-1 22:32 | 显示全部楼层

的确太长啦,没特殊要求没必要搞这么复杂撒!

  
hotpower 发表于 2007-11-4 22:10 | 显示全部楼层

IO0CLR,IO0SET的用法都没搞清楚~~~

  
hab2000 发表于 2007-11-5 16:44 | 显示全部楼层

周公的程序,请参考。

  <br /> 相关链接:<a href='https://bbs.21ic.com/upfiles/img/200711/2007115164411979.rar'>https://bbs.21ic.com/upfiles/img/200711/2007115164411979.rar</a>
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

28

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部