麻烦大家帮我看看, 我这段 STN32与STC 的I2C 通信 代码 有...
本帖最后由 zhengbingyan 于 2014-5-28 09:19 编辑我的 I2C是 基于原子哥 的 MyIIC.c 的。I2C 是模拟的。读 AT24C02能读得同,但是与STC单片机通信 握手不成功(我STC的I2C 也是模拟的)。STM32发给STC 器件地址,让STC_I2C 去寻址。但是没有返回ACK ,说明握手不成功。这是为什么?
请问有人调试过 I2C 通讯,主从都是模拟的 I2C 吗???
求高人指点迷津,不胜感激!
以下是我 STM32 读 STC 的 I2C 代码, 底层的I2C 是模拟 的 ,是跟原子哥 的 myiic.c一样的。
u8 Digital_Sensor_Read(void)
{
u8 temp=0;
IIC_Start();//发送起始位
IIC_Send_Byte(0XA0);// 发送写控制命令
if(IIC_Wait_Ack())// 等待ACK
printf("\r\n 1 I2C应答失败" );
IIC_Send_Byte(0x00); // 发送写地址
IIC_Wait_Ack();
if(IIC_Wait_Ack()) // 等待ACK
printf("\r\n 2 I2C应答失败" );
IIC_Start(); //发送起始位
IIC_Send_Byte(0XA1);// 发送读控制命令
if(IIC_Wait_Ack())// 等待ACK
printf("\r\n 3 I2C应答失败" );
temp=IIC_Read_Byte(0); // 0=NO ACK , 1=ACK
IIC_Stop();//产生一个停止条件
delay_us(8);
return temp;
}
问题已经解决了,我主机STM32 的 I2C 为软件模拟,SCL频率为400Khz 左右 ;从机 STC 的 I2C 也是模拟,不过是用会编写的。
之所以会出现 ,程序 代码没问题,硬件的连线也是没问题的
问题出在, STC12C5406AD 的供电范围是 5.5-3.4,而我是直接拉 STM32 的3.3V给STC 的,从而导致STC 供电不足,工作不起来! 从机代码处理问题 用io模拟i2c,通信频率要降下来,不然从机反应不过来的 funnybow 发表于 2014-5-27 17:28
用io模拟i2c,通信频率要降下来,不然从机反应不过来的
请问如何才能降下来? funnybow 发表于 2014-5-27 17:28
用io模拟i2c,通信频率要降下来,不然从机反应不过来的
我主机STM32 的I2C 也是模拟的,如何才能降低 I2C 的通信频率? 就是主机发时钟信号的时候在高电平的时候时间延长点,你可以试试在时钟的高低电平都延时5us,这时时钟频率是100K,试试从机能不能反应过来,如果反应不过来可以用汇编写接收的程序 funnybow 发表于 2014-5-27 23:05
就是主机发时钟信号的时候在高电平的时候时间延长点,你可以试试在时钟的高低电平都延时5us,这时时钟频率 ...
好的,谢谢你。我明天试试看。从机已经是用汇编写的代码了。 funnybow 发表于 2014-5-27 23:05
就是主机发时钟信号的时候在高电平的时候时间延长点,你可以试试在时钟的高低电平都延时5us,这时时钟频率 ...
void IIC_Send_Byte(u8 txd)
{
u8 t;
SDA_OUT(); // SDA 设置为输出
IIC_SCL=0;//拉低时钟开始数据传输
for(t=0;t<8;t++)
{
if((txd&0x80)>>7)
IIC_SDA=1;
else
IIC_SDA=0;
txd<<=1;
delay_us(5);
IIC_SCL=1;
delay_us(5);
IIC_SCL=0;
delay_us(5);
}
//IIC_SCL=1; //总线释放
}
这样修改对嘛? 第一个5us可以不要 funnybow 发表于 2014-5-27 23:22
第一个5us可以不要
{:handshake:} ,明天试试。具体情况在反馈上来,让别人条I2C也少走弯路{:biggrin:} 从机没硬件I2C,就需要程序不停的扫描相应的IO口,这时候I2C频率快了就会扫描不到时钟线的变化 funnybow 发表于 2014-5-27 23:25
从机没硬件I2C,就需要程序不停的扫描相应的IO口,这时候I2C频率快了就会扫描不到时钟线的变化 ...
您说的 “I2C频率快了就会扫描不到时钟线的变化”是指我主机I2C 频率快了,从机需要不断扫描IO ,这个时候频率跟不上吗? 对啊,从机就像ADC采样一样,你主机发过来的I2C频率快了从机就采不到真实的变化了 funnybow 发表于 2014-5-27 23:30
对啊,从机就像ADC采样一样,你主机发过来的I2C频率快了从机就采不到真实的变化了 ...
过来人,经验啊。学习了。 zhengbingyan 发表于 2014-5-27 23:31
过来人,经验啊。学习了。
问题已经解决了,我主机STM32 的 I2C 为软件模拟,SCL频率为400Khz 左右 ;从机 STC 的 I2C 也是模拟,不过是用会编写的。
之所以会出现 ,程序 代码没问题,硬件的连线也是没问题的
问题出在, STC12C5406AD 的供电范围是 5.5-3.4,而我是直接拉 STM32 的3.3V给STC 的,从而导致STC 供电不足,工作不起来! funnybow 发表于 2014-5-27 23:30
对啊,从机就像ADC采样一样,你主机发过来的I2C频率快了从机就采不到真实的变化了 ...
问题已经解决了,我主机STM32 的 I2C 为软件模拟,SCL频率为400Khz 左右 ;从机 STC 的 I2C 也是模拟,不过是用会编写的。
之所以会出现 ,程序 代码没问题,硬件的连线也是没问题的
问题出在, STC12C5406AD 的供电范围是 5.5-3.4,而我是直接拉 STM32 的3.3V给STC 的,从而导致STC 供电不足,工作不起来!
页:
[1]