OpenEdv-开源电子网

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

I2C-EEPROM的page读写为0xff

[复制链接]

1

主题

4

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2021-12-9
在线时间
5 小时
发表于 2021-12-30 19:34:14 | 显示全部楼层 |阅读模式
2金钱
用的是f103zet6和AT24C02


//相关的宏定义

#define    IIC_APBxClkCmd                  RCC_APB1PeriphClockCmd
#define    IIC_GPIO_APBxCLKCmd        RCC_APB2PeriphClockCmd

#define    IIC_SCL_GPIO_CLK             RCC_APB2Periph_GPIOB
#define    IIC_SDA_GPIO_CLK             RCC_APB2Periph_GPIOB

#define    EEPROM_I2C                       I2C1
#define    IIC_CLK                             RCC_APB1Periph_I2C1
#define    IIC_SCL_GPIO_PIN              GPIO_Pin_6
#define    IIC_SDA_GPIO_Pin               GPIO_Pin_7#define    IIC_SCL_GPIO_PORT           GPIOB
#define    IIC_SDA_GPIO_PORT           GPIOB

#define    IIC_ClockSpeed_Config        400000
#define    IIC_OwnAddress_Config       0x5f
#define    EEPROM_WRITE_ADDRESS              0xA0    //1010000 0
#define    EEPROM_READ_ADDRESS                0xA1    //1010000 1



/**
  * @brief     I2C-EEPROM INIT
  * @param  N
  * @retval   N
  */

static void IIC_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    I2C_InitTypeDef I2C_InitStructure;      


/********************************RCC******************************/        
    IIC_GPIO_APBxCLKCmd(IIC_SCL_GPIO_CLK | IIC_SDA_GPIO_CLK,ENABLE);      //GPIO
    IIC_APBxClkCmd(IIC_CLK,ENABLE);                                                             //I2C


/********************************GPIO******************************/   
    GPIO_InitStructure.GPIO_Pin=IIC_SCL_GPIO_PIN;                //SCL,i2c1为PIN6
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_OD;   
    GPIO_Init(IIC_SCL_GPIO_PORT,&GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin=IIC_SDA_GPIO_Pin;                //SDA,i2c1为PIN7    GPIO_Init(IIC_SDA_GPIO_PORT,&GPIO_InitStructure);

/********************************IIC******************************/        
    I2C_InitStructure.I2C_Ack                     = I2C_Ack_Enable;                            //ACK使能
    I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;    //I2C寻址模式
    I2C_InitStructure.I2C_ClockSpeed           = IIC_ClockSpeed_Config;                   //通信速率
    I2C_InitStructure.I2C_DutyCycle             = I2C_DutyCycle_2;                          //占空比
    I2C_InitStructure.I2C_Mode                   = I2C_Mode_I2C;                             //模式
    I2C_InitStructure.I2C_OwnAddress1        = IIC_OwnAddress_Config;                 //I2C设备自身地址
    I2C_Init(EEPROM_I2C,&I2C_InitStructure);                                                   //初始化
    I2C_Cmd(EEPROM_I2C,ENABLE);                                                               //使能,EEPROM_I2C==I2C1
}


/**
  * @brief  I2C-EEPROM page Write
  * @param  addr: EEPROM addr
  * @param  data: page address
  * @param  numByte: num of data(numByte<=8)
  * @retval none
  */

void EEPROM_Page_Write(uint8_t addr,uint8_t *data,uint8_t numByte)
{
        //   1  start writing
        I2C_GenerateSTART(EEPROM_I2C,ENABLE);
            while(I2C_CheckEvent(EEPROM_I2C,I2C_EVENT_MASTER_MODE_SELECT)==ERROR);                             //EV5            
      

       //   2  device address   
        I2C_Send7bitAddress(EEPROM_I2C,EEPROM_WRITE_ADDRESS,I2C_Direction_Transmitter);
            while(I2C_CheckEvent(EEPROM_I2C,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)==ERROR);    //EV6

        //   3  word address
        I2C_SendData(EEPROM_I2C,addr);
            while(I2C_CheckEvent(EEPROM_I2C,I2C_EVENT_MASTER_BYTE_TRANSMITTING )==ERROR);        //EV8   
      

        //  4  data
        while(numByte--)        
        {
            I2C_SendData(EEPROM_I2C,*data);   
                while(I2C_CheckEvent(EEPROM_I2C,I2C_EVENT_MASTER_BYTE_TRANSMITTING )==ERROR);    //EV8     
            data++;
        }

        // 5 Finish
        I2C_GenerateSTOP(EEPROM_I2C,ENABLE);

}

/**
  * @brief    从EEPROM接收数据
  * @param  addr:   EEPROM addr
  * @param  *data: reading buffer addr
  * @retval   N
  */
void EEPROM_Read(uint8_t addr,uint8_t *data,uint8_t dataNumByteRead)
{
    //    1  start writing
    I2C_GenerateSTART(EEPROM_I2C,ENABLE);
         while(I2C_CheckEvent(EEPROM_I2C,I2C_EVENT_MASTER_MODE_SELECT)==ERROR);                       //EV5            

    //   2  device address
    I2C_Send7bitAddress(EEPROM_I2C,EEPROM_WRITE_ADDRESS,I2C_Direction_Transmitter);                    
         while(I2C_CheckEvent(EEPROM_I2C,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)==ERROR);    //EV6   
        
    //   3  word address
    I2C_SendData(EEPROM_I2C,addr);
        while(I2C_CheckEvent(EEPROM_I2C,I2C_EVENT_MASTER_BYTE_TRANSMITTING )==ERROR);             //EV7               

   
   //   4   strat reading
    I2C_GenerateSTART(EEPROM_I2C,ENABLE);
        while(I2C_CheckEvent(EEPROM_I2C,I2C_EVENT_MASTER_MODE_SELECT)==ERROR);                          //EV5   

   //   5  device address
    I2C_Send7bitAddress(EEPROM_I2C,EEPROM_READ_ADDRESS,I2C_Direction_Receiver);                    
        while(I2C_CheckEvent(EEPROM_I2C,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)==ERROR);        //EV6
   //   6  receive data
        while(dataNumByteRead)
        {
            //如果是最后一个字节
            if(dataNumByteRead==1)
            {
                I2C_AcknowledgeConfig(EEPROM_I2C,DISABLE);
            }
            while(I2C_CheckEvent(EEPROM_I2C,I2C_EVENT_MASTER_BYTE_RECEIVED )==ERROR);                //EV7
           
            *data=I2C_ReceiveData(EEPROM_I2C);
            data++;
            dataNumByteRead--;
        }
        
    I2C_GenerateSTOP(EEPROM_I2C,ENABLE);
}


uint8_t    readData[8]={0};
uint8_t    I2C_data[8]={1,2,3,4,5,6,7,8};

结果只能输出1,后面的数都是0xff


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2021-12-9
在线时间
5 小时
 楼主| 发表于 2021-12-30 19:39:12 | 显示全部楼层
补充:main函数在写之后加了个等待
void EEPROM_WaitForWriting(void)
{
        do
        {
                I2C_GenerateSTART(EEPROM_I2C,ENABLE);
                        while(I2C_GetFlagStatus(EEPROM_I2C,I2C_FLAG_SB)==RESET);                                        //EV5                       
                I2C_Send7bitAddress(EEPROM_I2C,EEPROM_WRITE_ADDRESS,I2C_Direction_Transmitter);                                        //write
        }while(I2C_GetFlagStatus(EEPROM_I2C,I2C_FLAG_ADDR)==RESET);        //EV6
        I2C_GenerateSTOP(EEPROM_I2C,ENABLE);
}
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2021-12-9
在线时间
5 小时
 楼主| 发表于 2021-12-30 19:41:50 | 显示全部楼层
readData除了第一个元素为1,其他7个都是255
有大佬知道是什么原因吗,问一下谢谢
回复

使用道具 举报

6

主题

890

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1481
金钱
1481
注册时间
2020-8-19
在线时间
336 小时
发表于 2021-12-31 13:47:44 | 显示全部楼层
帮顶  
回复

使用道具 举报

80

主题

931

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3348
金钱
3348
注册时间
2013-5-28
在线时间
468 小时
发表于 2021-12-31 15:49:46 | 显示全部楼层
关注复位的情况,这种EEPROM经常死掉,我很多时候是会强行给一个停止位给他
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2021-12-9
在线时间
5 小时
 楼主| 发表于 2022-1-4 13:06:18 | 显示全部楼层
聚东风 发表于 2021-12-31 15:49
关注复位的情况,这种EEPROM经常死掉,我很多时候是会强行给一个停止位给他

感谢
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-21 01:55

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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