OpenEdv-开源电子网

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

求助求助大佬 stm32F407 24c64页读卡死!!!!

[复制链接]

2

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2022-5-19
在线时间
42 小时
发表于 2022-6-10 14:00:23 | 显示全部楼层 |阅读模式
5金钱
本帖最后由 warbxnr 于 2022-6-14 15:30 编辑

测试24c64 擦写次数的程序,现在页写,字节读可以。页读就歇逼了。大神棒棒忙啊!!

字节读代码:
u8 AT24CXX_ReadOneByte(u16 ReadAddr)
{                                 
        u8 temp=0;                                                                                                                                                               
    IIC_Start();  
        
                IIC_Send_Byte(0XAe);           //·¢ËíD′Ãüáî
                IIC_Wait_Ack();
                IIC_Send_Byte(ReadAddr>>8);
                //·¢Ëí¸ßμØÖ·            
          //·¢ËíÆ÷¼tμØÖ·0XA0,D′êy¾Y            
         IIC_Wait_Ack();
    IIC_Send_Byte(ReadAddr%256);   //·¢ËíμíμØÖ·
        IIC_Wait_Ack();            
        IIC_Start();                     
        IIC_Send_Byte(0XAF);           //½øèë½óêÕģ꽠                          
        IIC_Wait_Ack();         
    temp=IIC_Read_Byte(0);                  
    IIC_Stop();//2úéúò»¸öí£Ö1ìõ¼t            
        return temp;
}
-------------------------------------------------------------------------
页读代码
unsigned char Read_opration1(u16 start_addr,unsigned char nb_of_byte,unsigned char *destination,unsigned char device_addr)
{
  unsigned int i;

ptr1 = destination; //»o′æ
        
                 IIC_Start();
                 IIC_Send_Byte(0XAe);           //·¢ËíD′Ãüáî
                IIC_Wait_Ack();
                IIC_Send_Byte(start_addr>>8);
                //·¢Ëí¸ßμØÖ·            
          //·¢ËíÆ÷¼tμØÖ·0XA0,D′êy¾Y            
         IIC_Wait_Ack();
    IIC_Send_Byte(start_addr%256);   //·¢ËíμíμØÖ·
        IIC_Wait_Ack();            
        IIC_Start();                     
        IIC_Send_Byte(0XAF);           //½øèë½óêÕģ꽠                          
        IIC_Wait_Ack();        
        for(i=0;i<nb_of_byte-1;i++)
   {
        
    *ptr1++=IIC_Read_Byte(1);
         
         }
         *ptr1 = IIC_Read_Byte(0);
    IIC_Stop();//2úéúò&#187;&#184;&#246;í£&#214;1ì&#245;&#188;t         

        }

============================================================================
读写验证代码
Chip_write_guding_data(addr_eeprom,nb_of_byte,source1,device_addr); //页写
          Read_opration(addr_eeprom,nb_of_byte,sram,device_addr);//页读 实现不了
          for(i=0;i<nb_of_byte;i++)
            {
                                                        
                    //temp=AT24CXX_ReadOneByte(i);          //字节读可以实现
                    
                                       
                                
                Address_EEprom++;      

              if(sram == 0xa8)
              {
              LCD_ShowString(30, 250,200,16,16,"Write  ok");
                                                                LCD_ShowxNum(120, 250, Address_EEprom, 4, 24, 0);
                                                        //        error_status = 1;
              //    break;
                                                }

实验24 IIC实验.zip

4.77 MB, 下载次数: 1

最佳答案

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

你检查下IIC读写函数里操作SCL、SDA是否有延时,减小延时就行。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

12

主题

3344

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8464
金钱
8464
注册时间
2020-5-11
在线时间
3904 小时
发表于 2022-6-10 14:00:24 | 显示全部楼层
warbxnr 发表于 2022-6-14 13:06
unsigned char *gzg = (unsigned char *)0x20008007;
现在可以写读了 24c64整片。一分钟才22次。
void  ...

你检查下IIC读写函数里操作SCL、SDA是否有延时,减小延时就行。
专治疑难杂症
回复

使用道具 举报

2

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2022-5-19
在线时间
42 小时
 楼主| 发表于 2022-6-10 14:02:30 | 显示全部楼层
主要是根据 原点 标准例程-库函数版本 的IIC实验代码改的!!!
回复

使用道具 举报

2

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2022-5-19
在线时间
42 小时
 楼主| 发表于 2022-6-10 15:02:15 | 显示全部楼层
大佬看看留点建议啊
回复

使用道具 举报

2

主题

369

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4241
金钱
4241
注册时间
2020-7-24
在线时间
714 小时
发表于 2022-6-10 15:58:49 | 显示全部楼层
帮顶  
回复

使用道具 举报

12

主题

3344

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8464
金钱
8464
注册时间
2020-5-11
在线时间
3904 小时
发表于 2022-6-10 16:40:05 | 显示全部楼层
本帖最后由 LcwSwust 于 2022-6-10 16:42 编辑

先调试一下看卡死在哪个位置,估计是IIC_Wait_Ack没等到ACK,然后对照一下24C64的手册中的时序,看是否正确。
以后遇到有这种循环等待的情况,可以加个超时处理避免卡死,假如24C64芯片取掉了,程序是否还能运行其它程序。
专治疑难杂症
回复

使用道具 举报

2

主题

592

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1458
金钱
1458
注册时间
2019-7-28
在线时间
137 小时
发表于 2022-6-10 16:43:17 | 显示全部楼层
帮顶            
回复

使用道具 举报

2

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2022-5-19
在线时间
42 小时
 楼主| 发表于 2022-6-10 20:09:51 | 显示全部楼层
LcwSwust 发表于 2022-6-10 16:40
先调试一下看卡死在哪个位置,估计是IIC_Wait_Ack没等到ACK,然后对照一下24C64的手册中的时序,看是否正确 ...

用原子的读程序
/WriteAddr :开始写入的地址 对24c02为0~255
//pBuffer   :数据数组首地址
//NumToWrite:要写入数据的个数
void AT24CXX_Write(u16 WriteAddr,u8 *pBuffer,u16 NumToWrite)
{
        while(NumToWrite--)
        {
                AT24CXX_WriteOneByte(WriteAddr,*pBuffer);
                WriteAddr++;
                pBuffer++;
        }
}
是不卡了 读出来的 全不对 还不相同
回复

使用道具 举报

2

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2022-5-19
在线时间
42 小时
 楼主| 发表于 2022-6-10 20:13:24 | 显示全部楼层
protues 仿真不了 就很头大,大佬们有什么好办法啊
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2022-6-12 23:10:20 | 显示全部楼层
warbxnr 发表于 2022-6-10 20:13
protues 仿真不了 就很头大,大佬们有什么好办法啊

硬件仿真
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2022-5-19
在线时间
42 小时
 楼主| 发表于 2022-6-14 10:11:26 | 显示全部楼层
LcwSwust 发表于 2022-6-10 16:40
先调试一下看卡死在哪个位置,估计是IIC_Wait_Ack没等到ACK,然后对照一下24C64的手册中的时序,看是否正确 ...

目前问题可能是读出的来的缓存 起始地址不知道,
unsigned char *gzg = (unsigned char *)0x20000070; wtach1 观察也确实读出来0XAA,但是就是不知道缓存放哪儿?
回复

使用道具 举报

12

主题

3344

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8464
金钱
8464
注册时间
2020-5-11
在线时间
3904 小时
发表于 2022-6-14 10:17:23 | 显示全部楼层
warbxnr 发表于 2022-6-14 10:11
目前问题可能是读出的来的缓存 起始地址不知道,
unsigned char *gzg = (unsigned char *)0x20000070; w ...

为啥这样写呢,自己定义一个数组用来存数据不就完了。
专治疑难杂症
回复

使用道具 举报

2

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2022-5-19
在线时间
42 小时
 楼主| 发表于 2022-6-14 13:06:41 | 显示全部楼层
LcwSwust 发表于 2022-6-14 10:17
为啥这样写呢,自己定义一个数组用来存数据不就完了。

unsigned char *gzg = (unsigned char *)0x20008007;
现在可以写读了 24c64整片。一分钟才22次。
void IIC_Init(void)
{                        
  GPIO_InitTypeDef  GPIO_InitStructure;

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//ê1&#196;üGPIOBê±&#214;ó

  //GPIOB8,B93&#245;ê&#188;&#187;ˉéè&#214;&#195;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//&#198;&#213;í¨ê&#228;3&#246;&#196;£ê&#189;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;//í&#198;íìê&#228;3&#246;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//é&#207;à-
  GPIO_Init(GPIOB, &GPIO_InitStructure);//3&#245;ê&#188;&#187;ˉ
        IIC_SCL=1;
        IIC_SDA=1;
}


时钟频率 怎么调可以高于400K   达到1M啊  
回复

使用道具 举报

2

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2022-5-19
在线时间
42 小时
 楼主| 发表于 2022-6-14 13:36:00 | 显示全部楼层
LcwSwust 发表于 2022-6-10 14:00
你检查下IIC读写函数里操作SCL、SDA是否有延时,减小延时就行。

问题差不多了,感谢大佬。一分钟35次了。
还有个问题 循环函数
  Endurance_Whole_Chip(0x00,128,test_data1,test_data2,gzg,0xae);
从0X00地址开始,一次128个 就是4页。8192就要 80次 循环。256大了就卡死
我在atmega128上就是2048 循环4次。还需要再看看。
回复

使用道具 举报

12

主题

3344

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8464
金钱
8464
注册时间
2020-5-11
在线时间
3904 小时
发表于 2022-6-14 14:07:10 | 显示全部楼层
warbxnr 发表于 2022-6-14 13:36
问题差不多了,感谢大佬。一分钟35次了。
还有个问题 循环函数
  Endurance_Whole_Chip(0x00,128,test_ ...

QQ图片20210717101417.png 嗯,加油。
专治疑难杂症
回复

使用道具 举报

2

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2022-5-19
在线时间
42 小时
 楼主| 发表于 2022-6-14 14:08:29 | 显示全部楼层

改成 256 仿真 卡在这了 无限循环了。 Hard Fault异常
void HardFault_Handler(void)
{
  /* Go to infinite loop when Hard Fault exception occurs */
  while (1)
  {
  }
}
回复

使用道具 举报

12

主题

3344

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8464
金钱
8464
注册时间
2020-5-11
在线时间
3904 小时
发表于 2022-6-14 14:29:25 | 显示全部楼层
warbxnr 发表于 2022-6-14 14:08
改成 256 仿真 卡在这了 无限循环了。 Hard Fault异常
void HardFault_Handler(void)
{

上代码呀。。。
专治疑难杂症
回复

使用道具 举报

2

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2022-5-19
在线时间
42 小时
 楼主| 发表于 2022-6-14 15:32:17 | 显示全部楼层

我上传了 整个压缩文件在一楼,现在256有可能溢出 或越界了 。太深奥 不会搞 。 255可以跑
回复

使用道具 举报

12

主题

3344

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8464
金钱
8464
注册时间
2020-5-11
在线时间
3904 小时
发表于 2022-6-15 16:03:03 | 显示全部楼层
warbxnr 发表于 2022-6-14 15:32
我上传了 整个压缩文件在一楼,现在256有可能溢出 或越界了 。太深奥 不会搞 。 255可以跑

Endurance_Whole_Chip()调用了Chip_write_guding_data()又调用了Write_guding_data();
Write_guding_data()里有这样的语句:ptr = source;for(i=0;i<nb_of_byte;i++){IIC_Send_Byte(*ptr);ptr++;
但是main.c里unsigned const char test_data1[1]={0xAA};
所以可能造成读取数组时越界。但是我没看出来为啥255可以256不行。
专治疑难杂症
回复

使用道具 举报

2

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2022-5-19
在线时间
42 小时
 楼主| 发表于 2022-6-15 19:03:40 | 显示全部楼层
LcwSwust 发表于 2022-6-15 16:03
Endurance_Whole_Chip()调用了Chip_write_guding_data()又调用了Write_guding_data();
Write_guding_dat ...

Read_opration1(u16 start_addr,unsigned char nb_of_byte,unsigned char *destination,unsigned char device_addr)
改为unsigned int nb_of_byte
问题已经找到了 ,我的大意。基础太差了。多谢多谢!!
回复

使用道具 举报

12

主题

3344

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8464
金钱
8464
注册时间
2020-5-11
在线时间
3904 小时
发表于 2022-6-16 09:07:34 | 显示全部楼层
warbxnr 发表于 2022-6-15 19:03
Read_opration1(u16 start_addr,unsigned char nb_of_byte,unsigned char *destination,unsigned char de ...

QQ图片20210717101417.png
专治疑难杂症
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-27 00:17

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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