OpenEdv-开源电子网

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

求助ST32F103C8RT6 PC14=SCK,PC15=SDA读写24C08程序

[复制链接]

1

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2018-1-29
在线时间
16 小时
发表于 2018-2-6 01:31:14 | 显示全部楼层 |阅读模式
1金钱
求助ST32F103C8RT6  PC14=SCK,PC15=SDA读写24C08程序,搞了两天,仿原子的例程序,但不成功,我已修过:1:将程序中读写芯片设成24C08;
2:将将程序中PB6,PB7设成PC14,PC15;
3:将程序中65535设成1023;
4:将STM32的PC14,P15设成普通IO口;
5:将STM32的P15=SDA设成输出输入口;
6:将延时delay加大了10倍;


搞了两天半,人累,还是没搞好

最佳答案

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

eeprom通用驱动:http://blog.csdn.net/qq_20553613/article/details/78878211
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

685

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3448
金钱
3448
注册时间
2017-7-4
在线时间
869 小时
发表于 2018-2-6 01:31:15 | 显示全部楼层
回复

使用道具 举报

1

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2018-1-29
在线时间
16 小时
 楼主| 发表于 2018-2-7 20:58:44 | 显示全部楼层
检查芯片        check24cxx        (        );        读出来的temp是0xff,请教大神
回复

使用道具 举报

6

主题

462

帖子

0

精华

高级会员

Rank: 4

积分
906
金钱
906
注册时间
2017-12-15
在线时间
111 小时
发表于 2018-2-7 21:00:28 | 显示全部楼层
kacanmmx 发表于 2018-2-7 20:58
检查芯片        check24cxx        (        );        读出来的temp是0xff,请教大神

步骤1、尝试EEPROM的那个I2C地址的寻址是否有应答信号?拔掉EEPROM之后是否没有应答信号?

完成后回复。
回复

使用道具 举报

1

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2018-1-29
在线时间
16 小时
 楼主| 发表于 2018-2-7 21:05:44 | 显示全部楼层
u8 IIC_Wait_Ack(void);return 0; 接收应答成功!!
回复

使用道具 举报

6

主题

462

帖子

0

精华

高级会员

Rank: 4

积分
906
金钱
906
注册时间
2017-12-15
在线时间
111 小时
发表于 2018-2-7 21:10:48 | 显示全部楼层
kacanmmx 发表于 2018-2-7 21:05
u8 IIC_Wait_Ack(void);return 0; 接收应答成功!!

步骤2、尝试向EEPROM的地址0x01写入数据0x00,是否有应答信号?
回复

使用道具 举报

1

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2018-1-29
在线时间
16 小时
 楼主| 发表于 2018-2-7 21:23:24 | 显示全部楼层
将24C08拆下来,放在24CXX读写器上读出数据显示,能将0x55数据写进地址0x3FF内
回复

使用道具 举报

1

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2018-1-29
在线时间
16 小时
 楼主| 发表于 2018-2-7 21:24:25 | 显示全部楼层
1.jpg
回复

使用道具 举报

6

主题

462

帖子

0

精华

高级会员

Rank: 4

积分
906
金钱
906
注册时间
2017-12-15
在线时间
111 小时
发表于 2018-2-7 21:31:20 | 显示全部楼层
kacanmmx 发表于 2018-2-7 21:23
将24C08拆下来,放在24CXX读写器上读出数据显示,能将0x55数据写进地址0x3FF内

将0x55数据写进地址0x3FF内,是你的操作吗?

那么现在还有什么问题吗??
回复

使用道具 举报

1

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2018-1-29
在线时间
16 小时
 楼主| 发表于 2018-2-7 21:39:47 | 显示全部楼层
不是我操作的,是程序自己写进的,按原子作法是先写进0X55后,再读出来,如果读出来 的结果还是0X55,那么就认为24C08正常,但我现在读出来是0XFF,片子自检都无法通过
回复

使用道具 举报

6

主题

462

帖子

0

精华

高级会员

Rank: 4

积分
906
金钱
906
注册时间
2017-12-15
在线时间
111 小时
发表于 2018-2-7 22:01:38 | 显示全部楼层
kacanmmx 发表于 2018-2-7 21:39
不是我操作的,是程序自己写进的,按原子作法是先写进0X55后,再读出来,如果读出来 的结果还是0X55,那么就 ...

你用你的单片机程序,在某个特定的位置写一个字节,然后读一下试试。

这个片子不存在所谓的自检功能,你可以把代码贴出来。
回复

使用道具 举报

1

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2018-1-29
在线时间
16 小时
 楼主| 发表于 2018-2-7 22:19:02 | 显示全部楼层
//在AT24CXX指定地址读出一个数据
//ReadAddr:开始读数的地址  
//返回值  :读到的数据
u8 AT24CXX_ReadOneByte(u16 ReadAddr)
{                                  
        u8 temp=0;        u16 x=0;                                                                                                                                               
    IIC_Start();  
               
//         if(EE_TYPE>AT24C16)
//         {
//                 IIC_Send_Byte(0xA0);           //发送写命令
//                 IIC_Wait_Ack();
//                 IIC_Send_Byte(ReadAddr/0x100);//发送高地址         
//         }else IIC_Send_Byte(0XA0+((ReadAddr/256)<<1));   //发送器件地址0XA0,写数据          

          x=ReadAddr;
                x=x>>8;                                                        //取出高字节
                x=x<<1;
                x=x|0xa0;
                IIC_Send_Byte(x);////发送设备地址+写信号
       
        IIC_Wait_Ack();
    IIC_Send_Byte(ReadAddr%256);   //发送低地址
        IIC_Wait_Ack();            
        IIC_Start();                     
        IIC_Send_Byte(0xA1);           //进入接收模式                          
        IIC_Wait_Ack();         
    temp=IIC_Read_Byte(0);       
        //IIC_NAck();          
    IIC_Stop();//产生一个停止条件
        return temp;
}
回复

使用道具 举报

1

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2018-1-29
在线时间
16 小时
 楼主| 发表于 2018-2-7 22:19:52 | 显示全部楼层
ReadAddr=1023
回复

使用道具 举报

1

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2018-1-29
在线时间
16 小时
 楼主| 发表于 2018-2-7 23:05:28 | 显示全部楼层
发现地址小于255的能正常读,大于255的不能正常读出来,但能写

//在AT24CXX指定地址读出一个数据
//ReadAddr:开始读数的地址  
//返回值  :读到的数据
u8 AT24CXX_ReadOneByte(u16 ReadAddr)
{                                  
        u8 temp=0;        //u16 x=0;                                                                                                                                               
    IIC_Start();  
               
        if(EE_TYPE>AT24C16)
        {
                IIC_Send_Byte(0xA0);           //发送写命令
                IIC_Wait_Ack();
                IIC_Send_Byte(ReadAddr/0x100);//发送高地址         
        }else IIC_Send_Byte(0XA0+((ReadAddr/256)<<1));   //发送器件地址0XA0,写数据          

//           x=ReadAddr;
//                 x=x>>8;                                                        //取出高字节
//                 x=x<<1;
//                 x=x|0xa0;
//                 IIC_Send_Byte(x);////发送设备地址+写信号
       
        IIC_Wait_Ack();
    IIC_Send_Byte(ReadAddr%256);   //发送低地址
        IIC_Wait_Ack();            
        IIC_Start();                     
        IIC_Send_Byte(0xA1);           //进入接收模式                          
        IIC_Wait_Ack();         
    temp=IIC_Read_Byte(0);       
        IIC_NAck();          
    IIC_Stop();//产生一个停止条件
        return temp;
}

//我用的是24C08,不知是什么原因?
回复

使用道具 举报

1

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2018-1-29
在线时间
16 小时
 楼主| 发表于 2018-2-8 01:21:58 | 显示全部楼层
终于搞好了,去掉最后面:
//IIC_NAck(); IIC_NAck();  //这句不能要,否则不正常



相信也有朋友像我这样的吧?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-8 02:24

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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