完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
IIC 即Inter-Integrated Circuit(集成电路总线),这种总线类型是由飞利浦半导体公司在八十年代初设计出来的,主要是用来连接整体电路(ICS) ,IIC是一种多向控制总线,也就是说多个芯片可以连接到同一总线结构下,同时每个芯片都可以作为实时数据传输的控制源。这种方式简化了信号传输总线。
I2C串行总线一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL。所有接到I2C总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上。以51单片机和AT24C02介绍IO模拟IIC通信。 启始与停止 启始条件:必须在所有命令之前发送,时钟线保持高电平期间,数据线电平从高到低的跳变作为IIC总线的启动信号。 停止条件:时钟线保持高电平期间,数据线电平从低到高的跳变作为IIC总线的停止信号。操作结束时必须发送停止条件。 void startbit() { clrSCL(); setSDA(); setSCL(); //时钟为高时 clrSDA(); //SDA下降沿 clrSCL(); } void stopbit() { clrSCL(); clrSDA(); setSCL(); //时钟为高时 setSDA(); //SDA上升沿 clrSCL(); } 应答信号 每次数据传送成功后,从设备发送一个应答信号。当第九个时钟信号产生时,产生应答信号的器件将SDA下拉为低,通知已经接收到8位数据。 void respond() { unsigned char i = 0; setSDA(); //释放总线 setSCL(); //时钟 while(SDA != 0) { i++; if(i 》 200) break; } clrSCL(); } 读写字节操作 IIC总线协议定义如下: 1. 只有在总线非忙时才被允许进行数据传输。 2. 在数据传输时,当时钟线为高电平,数据线必须为固定状态,不允许跳变,时钟线为高电平时数据线的任何电平变化都会被当做总线的启动或停止条件 void writeByte(unsigned char dat) { unsigned char i = 0; for(i = 0;i 《 8;i++) { clrSCL(); //拉低时钟线,改变SDA线的电平 if(dat & 0x80) setSDA(); else clrSDA(); setSCL(); //SDA电平稳定后,拉高时钟线 dat 《《= 1; } clrSCL(); } unsigned char readByte() { unsigned char i = 0,tmp = 0; for(i = 0;i 《 8;i++) { clrSCL(); //拉低时钟线 tmp 《《= 1; //准备读取数据 setSCL(); //拉高时钟线 if(SDA) tmp |= 0x01; } clrSCL(); return tmp; } AT24C02读写操作 void writeAT24XX(unsigned char addr,unsigned char dat) { startbit(); //起始信号 writeByte(0xa0); //器件地址 respond(); writeByte(addr); //器件内部地址 respond(); writeByte(dat); //数据 respond(); stopbit(); //停止 } unsigned char readAT24XX(unsigned char addr { unsigned char dat; startbit(); //起始信号 writeByte(0xa0); //器件地址 respond(); writeByte(addr); //器件内部地址 respond(); startbit(); //起始信号 writeByte(0xa1); //器件地址 respond(); dat = readByte(); //数据 stopbit(); //停止 return dat; } 主函数部分内容以及程序运行效果: void main() { unsigned char dat; initUart(); sendString(“UART INIT OK!!!/n”); //串口通信初始化 sendString(“write 0x05 --》 addr 0x00 /n”);//写入5到期间内部地址0 writeAT24XX(0x00,0x05); //写入数据 sendString(“read dat 《-- addr 0x00 /n”); //读出写入数据 dat = readAT24XX(0x00); //读出数据 sendString(“dat--》”); //打印 sendByte(dat + ‘0’); while(1); } |
|
|
|
只有小组成员才能发言,加入小组>>
793 浏览 0 评论
1152 浏览 1 评论
2528 浏览 5 评论
2861 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2711 浏览 6 评论
keil5中manage run-time environment怎么是灰色,不可以操作吗?
1071浏览 3评论
194浏览 2评论
456浏览 2评论
369浏览 2评论
M0518 PWM的电压输出只有2V左右,没有3.3V是怎么回事?
454浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 19:31 , Processed in 1.137334 second(s), Total 78, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号