OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3363|回复: 6

24C04_IIC_Write

[复制链接]

2

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2014-12-16
在线时间
6 小时
发表于 2016-10-23 11:03:06 | 显示全部楼层 |阅读模式
2金钱
24C04  START+发送0xA0 后, 应答失败. 为什么?
新建文件0.png
新建文件0.png

最佳答案

查看完整内容[请看2#楼]

我估计你第9个时钟应答的时候 ,你把SDA变成输出强制拉高了,结果,从机应答,SDA拉不下来!因为SDA变成输出,强制输出1会很强的,从机是拉不到绝对的0的,结果导致应答失败,直接在等待延时哪里IIC_STOP了,和我一开始一样,两个办法,第一变成输入,第二把等待延时去掉, 不要想把SDA强制拉低 来骗从机,这样在第9个时钟的下降沿,从机会不能出现一个高电平!一样会应答是吧通过你刚才的图片你的问题就是出现在应答的时候SDA不拉 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2016-5-29
在线时间
19 小时
发表于 2016-10-23 11:03:07 | 显示全部楼层
我估计你第9个时钟应答的时候 ,你把SDA变成输出强制拉高了,结果,从机应答,SDA拉不下来!因为SDA变成输出,强制输出1会很强的,从机是拉不到绝对的0的,结果导致应答失败,直接在等待延时哪里IIC_STOP了,和我一开始一样,两个办法,第一变成输入,第二把等待延时去掉, 不要想把SDA强制拉低 来骗从机,这样在第9个时钟的下降沿,从机会不能出现一个高电平!一样会应答是吧通过你刚才的图片你的问题就是出现在应答的时候SDA不拉低在等待延时哪里进入II2_STOP了 IMG_0766.JPG

回复

使用道具 举报

2

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2014-12-16
在线时间
6 小时
 楼主| 发表于 2016-10-23 11:09:00 | 显示全部楼层
AT24CXX_WriteOneByte(0xA1,0X11);


void AT24CXX_WriteOneByte(u16 WriteAddr,u8 DataToWrite)
{                                                                                                                                                                                          
    IIC_Start();  
        if(EE_TYPE>AT24C16)
        {
                IIC_Send_Byte(0XA0);            //·¢ËíD′Ãüáî
                IIC_Wait_Ack();
                IIC_Send_Byte(WriteAddr>>8);//·¢Ëí¸ßμØÖ·
        }else
        {
                IIC_Send_Byte(0XA0+((WriteAddr/256)<<1));   
        }         
        IIC_Wait_Ack();          
    IIC_Send_Byte(WriteAddr%256);   //·¢&#203;íμíμ&#216;&#214;·
        IIC_Wait_Ack();                                                                                                              
        IIC_Send_Byte(DataToWrite);                                               
        IIC_Wait_Ack();                                
    IIC_Stop();
        delay_ms(10);         
}
回复

使用道具 举报

2

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2014-12-16
在线时间
6 小时
 楼主| 发表于 2016-10-23 16:08:49 | 显示全部楼层
这个读地址数据  
地址:0
数据应该是:0x55(01010101),为什么SDA电压不对啊?
求解?
新建文件2.png
回复

使用道具 举报

2

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2014-12-16
在线时间
6 小时
 楼主| 发表于 2016-10-23 20:35:37 | 显示全部楼层
本帖最后由 abcdef_30705 于 2016-10-23 20:36 编辑

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;//GPIO_Mode_Out_PP ;
把这里改了,设成输入前要设置成开漏输出,再设成输入。推挽输出不行有跟我一样的朋友吗?

回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2016-10-24 22:45:23 | 显示全部楼层
帮顶
回复

使用道具 举报

2

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2014-12-16
在线时间
6 小时
 楼主| 发表于 2016-10-27 14:03:03 | 显示全部楼层
本帖最后由 abcdef_30705 于 2016-10-27 14:04 编辑

感谢回答
void IIC_Init(void)
{                                             
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOB, ENABLE );        

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;//SCL
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   //推挽
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
        GPIO_SetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;//SDA
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD ;  //改成开漏,上拉电阻4.7K
        GPIO_Init(GPIOB, &GPIO_InitStructure);
}

//IO方向设置PB7
#define SDA_IN()  {GPIOB->CRH&=0X0FFFFFFF;GPIOB->CRH|=8<<28;}
#define SDA_OUT() {GPIOB->CRH&=0X0FFFFFFF;GPIOB->CRH|=3<<28;}

现在能应答,能正常读写数据,
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-24 12:00

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表