zhengbingyan 发表于 2014-5-27 11:58:33

麻烦大家帮我看看, 我这段 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 供电不足,工作不起来!

wdluo 发表于 2014-5-27 12:08:10

从机代码处理问题

funnybow 发表于 2014-5-27 17:28:46

用io模拟i2c,通信频率要降下来,不然从机反应不过来的

zhengbingyan 发表于 2014-5-27 21:10:13

funnybow 发表于 2014-5-27 17:28
用io模拟i2c,通信频率要降下来,不然从机反应不过来的

请问如何才能降下来?

zhengbingyan 发表于 2014-5-27 21:13:26

funnybow 发表于 2014-5-27 17:28
用io模拟i2c,通信频率要降下来,不然从机反应不过来的

我主机STM32 的I2C 也是模拟的,如何才能降低 I2C 的通信频率?

funnybow 发表于 2014-5-27 23:05:53

就是主机发时钟信号的时候在高电平的时候时间延长点,你可以试试在时钟的高低电平都延时5us,这时时钟频率是100K,试试从机能不能反应过来,如果反应不过来可以用汇编写接收的程序

zhengbingyan 发表于 2014-5-27 23:16:20

funnybow 发表于 2014-5-27 23:05
就是主机发时钟信号的时候在高电平的时候时间延长点,你可以试试在时钟的高低电平都延时5us,这时时钟频率 ...

好的,谢谢你。我明天试试看。从机已经是用汇编写的代码了。

zhengbingyan 发表于 2014-5-27 23:19:37

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; //总线释放
}        

这样修改对嘛?

funnybow 发表于 2014-5-27 23:22:22

第一个5us可以不要

zhengbingyan 发表于 2014-5-27 23:23:40

funnybow 发表于 2014-5-27 23:22
第一个5us可以不要

{:handshake:} ,明天试试。具体情况在反馈上来,让别人条I2C也少走弯路{:biggrin:}

funnybow 发表于 2014-5-27 23:25:58

从机没硬件I2C,就需要程序不停的扫描相应的IO口,这时候I2C频率快了就会扫描不到时钟线的变化

zhengbingyan 发表于 2014-5-27 23:27:37

funnybow 发表于 2014-5-27 23:25
从机没硬件I2C,就需要程序不停的扫描相应的IO口,这时候I2C频率快了就会扫描不到时钟线的变化 ...

您说的 “I2C频率快了就会扫描不到时钟线的变化”是指我主机I2C 频率快了,从机需要不断扫描IO ,这个时候频率跟不上吗?

funnybow 发表于 2014-5-27 23:30:14

对啊,从机就像ADC采样一样,你主机发过来的I2C频率快了从机就采不到真实的变化了

zhengbingyan 发表于 2014-5-27 23:31:32

funnybow 发表于 2014-5-27 23:30
对啊,从机就像ADC采样一样,你主机发过来的I2C频率快了从机就采不到真实的变化了 ...

过来人,经验啊。学习了。

zhengbingyan 发表于 2014-5-28 09:19:53

zhengbingyan 发表于 2014-5-27 23:31
过来人,经验啊。学习了。

问题已经解决了,我主机STM32 的 I2C 为软件模拟,SCL频率为400Khz 左右 ;从机 STC 的 I2C 也是模拟,不过是用会编写的。
        之所以会出现 ,程序 代码没问题,硬件的连线也是没问题的
        问题出在, STC12C5406AD 的供电范围是 5.5-3.4,而我是直接拉 STM32 的3.3V给STC 的,从而导致STC 供电不足,工作不起来!

zhengbingyan 发表于 2014-5-28 09:20:20

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]
查看完整版本: 麻烦大家帮我看看, 我这段 STN32与STC 的I2C 通信 代码 有...