野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 55|回复: 1

IIC读写EEPROM实验

[复制链接]
发表于 3 天前 | 显示全部楼层 |阅读模式

有没有老哥帮小老弟看下呀


目的:想通过调用test02()函数,看看能否在上位机中正确输出数据,以此来判断I2C_BufferWrite和I2C_BufferRead函数是否正常;
结果:上位机中出现如下结果


  1. //在主函数中调用该函数



  2. void test02(void)
  3. {
  4.         uint16_t tem=18;
  5.         for(i=0; i<tem; i++){
  6.                 I2c_Buf_Write[i] = i;//程序给这里打了个断点,为啥
  7.         }
  8.        
  9.         I2C_BufferWrite(8, I2c_Buf_Write, tem);
  10.         I2C_BufferRead(8, I2c_Buf_Read, tem);
  11.        
  12.         printf("这是一个测试\n");
  13.         for(i=0;i<tem;i++){
  14.                 printf("%d ",I2c_Buf_Read[i]);
  15.         }
  16. }


  17. //

  18. //连续写入
  19. void I2C_BufferWrite(uint8_t WriteAddr, uint8_t* pBuffer, uint16_t numByte2Write){
  20.         uint8_t i;
  21.         uint8_t Addr = 0, count = 0, NumOfPage = 0, NumOfSingle = 0;
  22.        
  23.         Addr = WriteAddr % PageSize;        //相对于某一页来说,要写入的位置0-7
  24.         count = PageSize - Addr;                        //用于补齐未对齐页
  25.         NumOfPage = numByte2Write / PageSize;//可写入多少页
  26.         NumOfSingle = numByte2Write % PageSize;//最后一页写入的字节数
  27.        
  28.         //页写入对齐
  29.         if(Addr == 0){
  30.                 //NumOfPage<PageSize
  31.                 if(NumOfPage==0){
  32.                         PageWrite(WriteAddr, pBuffer, numByte2Write);
  33.                         EEPROM_WaitForWriteEnd();
  34.                 }
  35.                 //NumOfPage>PageSize
  36.                 else{
  37.                         while(NumOfPage--){
  38.                                 PageWrite(WriteAddr, pBuffer, PageSize);
  39.                                 EEPROM_WaitForWriteEnd();
  40.                                 WriteAddr += PageSize;
  41.                                 pBuffer += PageSize;
  42.                         }
  43.                         if(NumOfSingle){
  44.                                 PageWrite(WriteAddr, pBuffer, NumOfSingle);
  45.                                 EEPROM_WaitForWriteEnd();
  46.                         }
  47.                 }
  48.         }
  49.         //未对齐
  50.         else{
  51.         }
  52. }



  53. //页写入,每页字节数不能超过8字节
  54. uint8_t PageWrite(uint8_t WriteAddr, uint8_t* pBuffer, uint16_t numByte2Write){
  55.         uint8_t i;
  56.        
  57.         //等待总线空闲(这里需要搞个死循环吗)
  58.         while(!I2C_GetFlagStatus(EEPROM_I2Cx, I2C_FLAG_BUSY))
  59.                 I2C_GenerateSTART(EEPROM_I2Cx, ENABLE);//产生起始信号
  60.        
  61.         while(!I2C_CheckEvent(EEPROM_I2Cx, I2C_EVENT_MASTER_MODE_SELECT)){//等待EV5事件
  62.                 if((Timeout--)==0)
  63.                         return I2C_TIMEOUT_UserCallback(4);
  64.         }
  65.        
  66.         I2C_Send7bitAddress(EEPROM_I2Cx, EEPROM_I2C_ADDRESS, I2C_Direction_Transmitter);//发送从机地址
  67.        
  68.         while(!I2C_CheckEvent(EEPROM_I2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)){//等待EV6事件
  69.                 if((Timeout--)==0)
  70.                         return I2C_TIMEOUT_UserCallback(5);
  71.         }
  72.        
  73.         I2C_SendData(EEPROM_I2Cx, WriteAddr);//发送要写入的地址
  74.        
  75.         while(!I2C_CheckEvent(EEPROM_I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED)){
  76.                 if((Timeout--)==0)
  77.                         return I2C_TIMEOUT_UserCallback(6);
  78.         }
  79.        
  80.         for(i=0; i < numByte2Write; i++){
  81.                 I2C_SendData(EEPROM_I2Cx, pBuffer[i]);//发送一字节数据
  82.                
  83.                 while(!I2C_CheckEvent(EEPROM_I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED)){
  84.                         if((Timeout--)==0)
  85.                                 return I2C_TIMEOUT_UserCallback(7);
  86.                 }
  87.         }
  88.        
  89.         I2C_GenerateSTOP(EEPROM_I2Cx, ENABLE);//发送终止信号
  90.         return 1;
  91. }

复制代码


野火论坛202411202146431983..png
回复

使用道具 举报

 楼主| 发表于 3 天前 | 显示全部楼层
本帖最后由 coder_yang 于 2024-11-21 19:46 编辑

复制代码
找到问题了,正文中68行处,
应写成下面这样


  1. while(I2C_GetFlagStatus(EEPROM_I2Cx, I2C_FLAG_BUSY)){//等待EV5事件
  2.                 if((Timeout--)==0)
  3.                         return I2C_TIMEOUT_UserCallback(4);
  4.         }
  5.         I2C_GenerateSTART(EEPROM_I2Cx, ENABLE);//产生起始信号
复制代码



回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-23 16:19 , Processed in 0.074331 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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