完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
这个代码是我网上搞到的,研究了很久 结果搭建好电路 郁闷了竟然不行
大家看看代码有没有问题 个人觉得是有的首先 他没开中断 就在等中断 其次实际中它并没有得到我想要的现象 代码贴上如下: #include /**************************** I2C 状态定义 MT 主方式传输 MR 主方式接受 ***************************/ #define START 0x08 #define RE_START 0x10 #define MT_SLA_ACK 0x18 #define MT_SLA_NOACK 0x20 #define MT_DATA_ACK 0x28 #define MT_DATA_NOACK 0x30 #define MR_SLA_ACK 0x40 #define MR_SLA_NOACK 0x48 #define MR_DATA_ACK 0x50 #define MR_DATA_NOACK 0x58 #define RD_DEVICE_ADDR 0xA1 //前4位器件固定,后三位看连线,最后1位是读写指令位 #define WD_DEVICE_ADDR 0xA0 /*常用TWI操作(主模式写和读)*/ #define Start() (TWCR=(1< #define SetAck (TWCR|=(1< /*延时子程序*/ void delay_ms(int time) { int i; for(;time>0;time--) for(i=0;i<1000;i++); } /*串口初始化*/ void uart_init() { UCSRA=0x02; //异步正常模式 UCSRB=0x18; //允许发送接受中断和使能 UCSRC=0x06; //8位数据 UBRRH=0x00; UBRRL=12; //波特率位9600 } /********************************************* I2C总线写一个字节 返回0:写成功 返回1:写失败 **********************************************/ unsigned char I2C_Write(unsigned char Wdata,unsigned char RegAddress) { Start(); //I2C启动 Wait(); if(TestAck()!=START) return 1; //ACK Write8Bit(WD_DEVICE_ADDR); //写I2C从器件地址和写方式 Wait(); if(TestAck()!=MT_SLA_ACK) return 1; //ACK Write8Bit(RegAddress); //写器件相应寄存器地址 Wait(); if(TestAck()!=MT_DATA_ACK) return 1; //ACK Write8Bit(Wdata); //写数据到器件相应寄存器 Wait(); if(TestAck()!=MT_DATA_ACK) return 1; //ACK Stop(); //I2C停止 delay_ms(100); //延时 return 0; } /********************************************* I2C总线读一个字节 返回0:读成功 返回1:读失败 **********************************************/ unsigned char I2C_Read(unsigned RegAddress) { unsigned char temp; Start();//I2C启动 Wait(); if (TestAck()!=START) return 1; //ACK Write8Bit(WD_DEVICE_ADDR); //写I2C从器件地址和写方式 Wait(); if (TestAck()!=MT_SLA_ACK) return 1; //ACK Write8Bit(RegAddress); //写器件相应寄存器地址 Wait(); if (TestAck()!=MT_DATA_ACK) return 1; Start(); //I2C重新启动 Wait(); if (TestAck()!=RE_START) return 1; Write8Bit(RD_DEVICE_ADDR); //写I2C从器件地址和读方式 Wait(); if(TestAck()!=MR_SLA_ACK) return 1; //ACK Twi(); //启动主I2C读方式 Wait(); if(TestAck()!=MR_DATA_NOACK) return 1; //ACK temp=TWDR; //读取I2C接收数据 Stop(); //I2C停止 return temp; } void main() { unsigned char i; uart_init(); /*串口初始化*/ for(i=0;i<10;i++) I2C_Write(i,0x80+i); delay_ms(1000); while(1) { for(i=0;i<10;i++) { while(!(UCSRA&(1< UDR=I2C_Read(0x80+i); } } } |
|
相关推荐
8个回答
|
|
最好用示波器看一下,首先地址是否匹配,其次再看数据是否传输正确。
|
|
|
|
程序太长了,电路没连错吧?贴上来看一下
|
|
|
|
|
|
|
|
|
|
|
|
路过学习
|
|
|
|
这个调成功没啊 楼方 我也想试试 菜鸟一枚啊我
|
|
|
|
可能需要仔细看一下你的I2C器件,不同的器件,ACK信号的定义有点区别。
比如我们用24系列的器件,ACK可能会这样写: void ack() { SDA = 1; delay(); SCLK = 1; delay(); SCLK = 0; delay(); while(SDA!=0); } 又比如,我们用pixelplus的图象芯片,则ACK需要写成这样: void ACK() { SDA=1; delay(); SCLK=1; delay(); while(SDA!=0); SCLK=0; } 另外,I2C通信时,对应的上拉电阻跟速度是有很大关系的,一般来说,速度越高,上拉电阻阻值要用小 一点的电阻。 |
|
|
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
503 浏览 0 评论
求助一下关于51系列单片机的Timer0的计时问题,TH0、TL0+1的时间是怎么算的?
1756 浏览 1 评论
【RA-Eco-RA4E2-64PIN-V1.0开发板试用】开箱+Keil环境搭建+点灯+点亮OLED
1183 浏览 0 评论
【敏矽微ME32G070开发板免费体验】使用coremark测试敏矽微ME32G070 跑分
1053 浏览 0 评论
【敏矽微ME32G070开发板免费体验】开箱+点灯+点亮OLED
1287 浏览 2 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12022 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 19:23 , Processed in 0.682711 second(s), Total 86, Slave 69 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号