STM32通过I2C读写EEPROM的程序

2019-07-14 20:32发布

  1. /*I2C³õʼ»¯º¯Êý*/
  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. /*GPIOB³õʼ»¯º¯Êý*/                 
  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. /*µÈ´ýEEPROM¿ÕÏÐ״̬*/
  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. /*ÏòÖ¸¶¨µØַдµ¥¸ö×Ö½Ú³ÌÐò*/
  48. void i2c_write(u8 id,u8 address,u8 byte)
  49. {
  50. I2C_WaitEepromStandbyState(id);
  51. I2C_GenerateSTART  ( I2C1, ENABLE);//·¢ËÍÆðʼÐźÅ
  52. while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));     //ev5
  53. I2C_Send7bitAddress  ( I2C1,id, I2C_Direction_Transmitter); //·¢ËÍÆ÷¼þµØÖ·
  54.   while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED ));  //ev6
  55.   I2C_SendData  ( I2C1, address);//·¢ËÍÊý¾ÝÔÚ´æ´¢Æ÷ÖеĵØÖ·
  56.         while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));     //ev8
  57.   I2C_SendData  ( I2C1, byte);//·¢ËÍÊý¾Ý
  58.   while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));     //ev8_2
  59.   I2C_GenerateSTOP(I2C1, ENABLE);//·¢ËÍÍ£Ö¹ÐźÅ
  60.   }
  61. /*´ÓÖ¸¶¨µØÖ·¶Áµ¥¸ö×Ö½Ú³ÌÐò*/
  62. u8 i2c_read(u8 id,u8 address)
  63. {
  64.         u8 temp;
  65.         I2C_WaitEepromStandbyState(id);
  66.         I2C_GenerateSTART(I2C1, ENABLE);//·¢Æô¶¯ÐźÅ
  67.         while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));//EV5
  68.         I2C_Send7bitAddress  ( I2C1,id, I2C_Direction_Transmitter);//·¢ËÍÆ÷¼þµØÖ·
  69.         while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));//EV6
  70.         I2C_SendData  ( I2C1, address);//·¢ËÍÊý¾ÝÔÚ´æ´¢Æ÷ÖеØÖ·
  71.         while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));//EV8
  72.         I2C_GenerateSTART(I2C1, ENABLE);      //ÖØз¢ËÍ¿ªÊ¼ÐźÅ
  73.           while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT)); //ev5
  74.         I2C_AcknowledgeConfig(I2C1, DISABLE); //¹Ø±ÕÓ¦´ð¹¦ÄÜ
  75.         I2C_Send7bitAddress  ( I2C1,id, I2C_Direction_Receiver);//ÖØз¢ËÍÆ÷¼þµØÖ·
  76.         while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)); //ev6
  77.         temp=I2C_ReceiveData(I2C1);//½ÓÊÕÊý¾Ý
  78.         while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_RECEIVED)); //ev7
  79.         I2C_GenerateSTOP(I2C1, ENABLE);//·¢ËÍÍ£Ö¹ÐźÅ

  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)//¼ì²â¶Á³öдÈëÊÇ·ñÏàͬ
  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. }
复制代码

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。