微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > STM32通过I2C读写EEPROM的程序

STM32通过I2C读写EEPROM的程序

时间:10-02 整理:3721RD 点击:

  1. /*I2C3?ê??ˉoˉêy*/
  2. void i2c_init()
  3. {
  4. I2C_InitTypeDef I2C_Struct;

  5. RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);

  6. I2C_Struct.I2C_ClockSpeed=200000;
  7. I2C_Struct.I2C_Mode=I2C_Mode_I2C ;
  8. I2C_Struct.I2C_DutyCycle=I2C_DutyCycle_2;
  9. I2C_Struct.I2C_Ack=I2C_Ack_Enable;         
  10. I2C_Struct.I2C_AcknowledgedAddress=I2C_AcknowledgedAddress_7bit   ;
  11.   I2C_Init  ( I2C1, &I2C_Struct);
  12.   
  13.   I2C_Cmd(I2C1,ENABLE);  

  14. }
  15.             
  16. /*GPIOB3?ê??ˉoˉêy*/                 
  17. void gpio_init()   
  18. {
  19. GPIO_InitTypeDef GPIO_Struct;
  20. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);

  21.     GPIO_Struct.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7;
  22.      GPIO_Struct.GPIO_Mode=GPIO_Mode_AF_OD;
  23.      GPIO_Struct.GPIO_Speed= GPIO_Speed_50MHz;
  24.      GPIO_Init(GPIOB,&GPIO_Struct);

  25.     GPIO_Struct.GPIO_Pin=GPIO_Pin_9;
  26.      GPIO_Struct.GPIO_Mode=GPIO_Mode_Out_PP;
  27.      GPIO_Struct.GPIO_Speed= GPIO_Speed_50MHz;
  28.      GPIO_Init(GPIOB,&GPIO_Struct);       
  29. }
  30. /*μè′yEEPROM???D×′ì?*/
  31. void I2C_WaitEepromStandbyState(u8 id)         
  32. {
  33.     vu16 SR1_Tmp = 0;

  34.   do
  35.   {
  36.     /* Send START condition */
  37.     I2C_GenerateSTART(I2C1, ENABLE);
  38.     /* Read I2C1 SR1 register */
  39.     SR1_Tmp = I2C_ReadRegister(I2C1, I2C_Register_SR1);
  40.     /* Send EEPROM address for write */
  41.     I2C_Send7bitAddress(I2C1, id, I2C_Direction_Transmitter);
  42.   }while(!(I2C_ReadRegister(I2C1, I2C_Register_SR1) & 0x0002));      //estimate the value of ADDR
  43.   
  44.   /* Clear AF flag */
  45.   I2C_ClearFlag(I2C1, I2C_FLAG_AF);   
  46. }
  47. /*?ò???¨μ??·D′μ¥??×??ú3ìDò*/
  48. void i2c_write(u8 id,u8 address,u8 byte)
  49. {
  50. I2C_WaitEepromStandbyState(id);
  51. I2C_GenerateSTART  ( I2C1, ENABLE);//·¢?í?eê?D?o?
  52. while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));     //ev5
  53. I2C_Send7bitAddress  ( I2C1,id, I2C_Direction_Transmitter); //·¢?í?÷?tμ??·
  54.   while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED ));  //ev6
  55.   I2C_SendData  ( I2C1, address);//·¢?íêy?Y?ú′?′¢?÷?Dμ?μ??·
  56.         while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));     //ev8
  57.   I2C_SendData  ( I2C1, byte);//·¢?íêy?Y
  58.   while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));     //ev8_2
  59.   I2C_GenerateSTOP(I2C1, ENABLE);//·¢?íí£?1D?o?
  60.   }
  61. /*′ó???¨μ??·?áμ¥??×??ú3ìDò*/
  62. u8 i2c_read(u8 id,u8 address)
  63. {
  64.         u8 temp;
  65.         I2C_WaitEepromStandbyState(id);
  66.         I2C_GenerateSTART(I2C1, ENABLE);//·¢???ˉD?o?
  67.         while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));//EV5
  68.         I2C_Send7bitAddress  ( I2C1,id, I2C_Direction_Transmitter);//·¢?í?÷?tμ??·
  69.         while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));//EV6
  70.         I2C_SendData  ( I2C1, address);//·¢?íêy?Y?ú′?′¢?÷?Dμ??·
  71.         while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));//EV8
  72.         I2C_GenerateSTART(I2C1, ENABLE);      //??D?·¢?í?aê?D?o?
  73.           while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT)); //ev5
  74.         I2C_AcknowledgeConfig(I2C1, DISABLE); //1?±?ó|′e1|?ü
  75.         I2C_Send7bitAddress  ( I2C1,id, I2C_Direction_Receiver);//??D?·¢?í?÷?tμ??·
  76.         while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)); //ev6
  77.         temp=I2C_ReceiveData(I2C1);//?óê?êy?Y
  78.         while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_RECEIVED)); //ev7
  79.         I2C_GenerateSTOP(I2C1, ENABLE);//·¢?íí£?1D?o?

  80.         return temp;
  81. }

  82. int main(void)
  83. {
  84.   i2c_init();
  85.   gpio_init();
  86.   i2c_write(0xa2,3,0xab);
  87.   data=i2c_read(0xa2,3);
  88.         if(data == 0xab)//?ì2a?á3?D′è?ê?·??àí?
  89.         {
  90.                 for(;;)//LEDéá??
  91.                 {
  92.                                 Delay_MS(1000);
  93.                 //                GPIO_Write(GPIOB, 0x10);
  94.                                 GPIOB->ODR = 0x10;
  95.                                 GPIO_SetBits(GPIOB,GPIO_Pin_9);
  96.                 //                GPIO_Write(GPIOB, 0x00);
  97.                                 Delay_MS(1000);
  98.                                 GPIOB->ODR = 0x00;
  99.                                 GPIO_ResetBits(GPIOB,GPIO_Pin_9);
  100.                 }
  101.         }
  102.   while(1);
  103. }

复制代码


写入读出结果不一样,什么地方有问题呢?

这在HAL库中已经自动实现了。

我记得STM32F103自身带的I2C有问题,不稳定,一般都是模拟I2C时序。

HAL库只是听说过,没有用过,一直都是用标准库的,HAL库好用吗

嗯,在网上看到相关的问题了,但是模拟的话好像是比较麻烦的吧

我一开始也是用标准库,后来领导要用HAL库,我痛苦了一个星期,后来发现HAL库确实比标准库好用。改变吧。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top