社区
嵌入开发(WinCE)
帖子详情
用ATMEGA8开发GY273的程序,为什么I2C没有应答信号呢?
Lucas499
2019-08-24 07:08:54
如题
测了一下IO口的输出电压略小于3.3V
...全文
245
6
打赏
收藏
用ATMEGA8开发GY273的程序,为什么I2C没有应答信号呢?
如题 测了一下IO口的输出电压略小于3.3V
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
6 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
fly 100%
2019-09-03
打赏
举报
回复
这个没准备好是有啥使能位没开?
Lucas499
2019-08-30
打赏
举报
回复
引用 4 楼 迷雾绿洲 的回复:
先降速 波形图看一下,建立时间保持时间是否足够
现在是这样的 I2C通信正常,能够收到应答信号 但是GY273的数据寄存器不能读取,我结合手册和现象,能判断出是 数据没准备好,就被读取了,直接清零 这个有什么解决办法吗?
fly 100%
2019-08-30
打赏
举报
回复
先降速 波形图看一下,建立时间保持时间是否足够
Lucas499
2019-08-24
打赏
举报
回复
是下面一个程序,第一个贴错了~
Lucas499
2019-08-24
打赏
举报
回复
//ICC-AVR application builder : 2009-3-12 17:05:04 // Target : M8 // Crystal: 8.0000Mhz #include <avr/io.h> #include <avr/interrupt.h> #include <macros.h> #include "usart.h" void port_init(void) { DDRB|=0X04;//B2,LED_DOWN,PIN16 DDRC|=0X02;//C1,LED_LEFT,PIN24 DDRC|=0X08;//C3,LED_RIGHT,PIN26 DDRC|=0X20;//C5,LED_UP,PIN28 DDRB|=0X01;//B0,LED_OK,PIN14 DDRD|=0X40;//D6,TEST,PIN12 DDRC&=~0X01;//C0,KEY_LEFT,PIN23 DDRC&=~0X04;//C2,KEY_RIGHT,PIN25 DDRC&=~0X10;//C4,KEY_UP,PIN27 DDRB&=~0X02;//B1,KEY_DOWN,PIN15 DDRD&=~0X80;//D7,KEY_OK,PIN13 PORTC |= 0xFF; PORTB |= 0xFF; PORTD |= 0xFF; } //call this routine to initialize all peripherals void init_devices(void) { //stop errant interrupts until set up cli(); //disable all interrupts port_init(); MCUCR = 0x00; //MCU Control Register GICR = 0x00; //General Interrupt Control Register TIMSK = 0x00; //timer interrupt sources sei(); //re-enable interrupts //all peripherals are now initialized } /************************************************************************* 用 途:iic发送接收 Taget :mega8 crystal :8M 介 绍:PC4-SDA PC5-SCK/SCL //*********************************************************************** 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 0x3c //前4位器件固定,后三位看连线,最后1位是读写指令位 #define WD_DEVICE_ADDR 0x3d #define Start() (TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)) //启动I2C #define Stop() (TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN)) //停止I2C #define Wait() {while(!(TWCR&(1<<TWINT)));} //等待中断发生 #define TestAck() (TWSR&0xf8) //观察返回状态 #define SetAck (TWCR|=(1<<TWEA)) //做出ACK应答 #define SetNoAck (TWCR&=~(1<<TWEA)) //做出Not Ack应答 #define Twi() (TWCR=(1<<TWINT)|(1<<TWEN)) //启动I2C #define Write8Bit(x) {TWDR=(x);TWCR=(1<<TWINT)|(1<<TWEN);} //写数据到TWDR /*延时子程序*/ void delay_ms(int time) { int i; for(;time>0;time--) for(i=0;i<1000;i++); } //初始化 void iic_init() { TWBR= 0x20; //设置波特率 TWSR= 0x00; //设置预分频比 TWCR= 0x44; //使能应答,使能TWI DDRC|=(1<<PC4)|(1<<PC5); PORTC|=(1<<PC4)|(1<<PC5); } /********************************************* I2C总线写一个字节 返回0:写成功 返回1:写失败 **********************************************/ unsigned char iic_write(unsigned char Wdata,unsigned char RegAddress) { Start(); //I2C启动 Wait(); if(TestAck()!=START) return 1; //ACK Send_Char(0x11);//测试用 Write8Bit(WD_DEVICE_ADDR); //写I2C从器件地址和写方式 Wait(); Send_Char(0x22);//测试用 if(TestAck()!=MT_SLA_ACK) return 1; //ACK Send_Char(0x33);//测试用 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:读成功 返回0:读失败 **********************************************/ unsigned char iic_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,j; port_init(); init_devices(); usart_Init(); iic_init(); i=iic_write(0xaa,0X10);//在0X10地址写入数据0XAA if (i==1) PORTB=0x1;//若写入失败(i=1),B口0x01;若写入成功,B口输出0X02 else PORTB=0x2; j=iic_read(0X10);//读出0x10地址的数据 if(j==1) PORTD=0xff; //若读出失败(j=1),D口全灭;若读出成功,D口输出0XAA else PORTD=j; while(1) { ; } }
Lucas499
2019-08-24
打赏
举报
回复
附上程序 //ICC-AVR application builder : 2009-3-12 17:05:04 // Target : M8 // Crystal: 8.0000Mhz #include <avr/io.h> #include <avr/interrupt.h> #include <macros.h> #include "usart.h" void port_init(void) { DDRB|=0X04;//B2,LED_DOWN,PIN16 DDRC|=0X02;//C1,LED_LEFT,PIN24 DDRC|=0X08;//C3,LED_RIGHT,PIN26 DDRC|=0X20;//C5,LED_UP,PIN28 DDRB|=0X01;//B0,LED_OK,PIN14 DDRD|=0X40;//D6,TEST,PIN12 DDRC&=~0X01;//C0,KEY_LEFT,PIN23 DDRC&=~0X04;//C2,KEY_RIGHT,PIN25 DDRC&=~0X10;//C4,KEY_UP,PIN27 DDRB&=~0X02;//B1,KEY_DOWN,PIN15 DDRD&=~0X80;//D7,KEY_OK,PIN13 PORTC |= 0xFF; PORTB |= 0xFF; PORTD |= 0xFF; } //call this routine to initialize all peripherals void init_devices(void) { //stop errant interrupts until set up cli(); //disable all interrupts port_init(); MCUCR = 0x00; //MCU Control Register GICR = 0x00; //General Interrupt Control Register TIMSK = 0x00; //timer interrupt sources sei(); //re-enable interrupts //all peripherals are now initialized } /************************************************************************* 用 途:iic发送接收 Taget :mega8 crystal :8M 介 绍:PC4-SDA PC5-SCK/SCL //*********************************************************************** 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 0x3c //前4位器件固定,后三位看连线,最后1位是读写指令位 #define WD_DEVICE_ADDR 0x3d #define Start() (TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)) //启动I2C #define Stop() (TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN)) //停止I2C #define Wait() {while(!(TWCR&(1<<TWINT)));} //等待中断发生 #define TestAck() (TWSR&0xf8) //观察返回状态 #define SetAck (TWCR|=(1<<TWEA)) //做出ACK应答 #define SetNoAck (TWCR&=~(1<<TWEA)) //做出Not Ack应答 #define Twi() (TWCR=(1<<TWINT)|(1<<TWEN)) //启动I2C #define Write8Bit(x) {TWDR=(x);TWCR=(1<<TWINT)|(1<<TWEN);} //写数据到TWDR /*延时子程序*/ void delay_ms(int time) { int i; for(;time>0;time--) for(i=0;i<1000;i++); } //初始化 void iic_init() { TWBR= 0x20; //设置波特率 TWSR= 0x00; //设置预分频比 TWCR= 0x44; //使能应答,使能TWI DDRC|=(1<<PC4)|(1<<PC5); PORTC|=(1<<PC4)|(1<<PC5); } /********************************************* I2C总线写一个字节 返回0:写成功 返回1:写失败 **********************************************/ unsigned char iic_write(unsigned char Wdata,unsigned char RegAddress) { Start(); //I2C启动 Wait(); if(TestAck()!=START) return 1; //ACK Send_Char(0x11);//测试用 Write8Bit(WD_DEVICE_ADDR); //写I2C从器件地址和写方式 Wait(); Send_Char(0x22);//测试用 if(TestAck()!=MT_SLA_ACK) return 1; //ACK Send_Char(0x33);//测试用 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:读成功 返回0:读失败 **********************************************/ unsigned char iic_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,j; port_init(); init_devices(); usart_Init(); iic_init(); while(1) { ; } }
atmega
48的
I2C
程序
根据提供的文件信息,本文将详细解释与
ATmega
48微控制器使用I²C(Inter-Integrated Circuit)协议读写AT24C02 EEPROM相关的知识。 ### 一、
ATmega
48简介
ATmega
48是一款低功耗、高性能CMOS 8位微控制器,基于AVR ...
基于
atmega
8的
i2c
读写函数
1. 首先,我们需要配置
ATmega
8的两个I/O引脚(SDA和SCL)作为模拟
I2C
信号
的开漏输出,并通过外部上拉电阻来提供高电平。 2. 接着,我们需要编写软件模拟
I2C
时序的代码。这包括产生开始和停止条件,发送和接收数据,...
适用于
Atmega
16的IIC底层
程序
在嵌入式系统
开发
中,I²C(Inter-Integrated Circuit)是一种常见的串行通信协议,用于连接微控制器(如
Atmega
16)和其他低速外围设备,如传感器、存储器等。本教程将深入讲解如何为
Atmega
16编写I²C底层
程序
,以便...
cc_
i2c
.rar_CVAVR
I2C
_
atmega
128
i2c
【标题】"cc_
i2c
.rar_CVAVR
I2C
_
atmega
128
i2c
" 提供的资源是关于使用CVAVR
开发
平台在
ATmega
128单片机上实现
I2C
通信协议的资料。
I2C
(Inter-Integrated Circuit,集成电路互连)是一种由Philips公司(现为NXP半导体...
ATmega
8 示例
程序
在这个"
ATmega
8 示例
程序
"的压缩包中,你将找到一系列关于如何使用
ATmega
8进行各种基础应用的实例代码。 1. **I/O端口操作**:
ATmega
8拥有多个可配置的输入/输出端口,这些端口可以设置为输入或输出模式。示例
程序
...
嵌入开发(WinCE)
19,518
社区成员
41,565
社区内容
发帖
与我相关
我的任务
嵌入开发(WinCE)
硬件/嵌入开发 嵌入开发(WinCE)
复制链接
扫一扫
分享
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章