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. }
复制代码

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
mhb520
1楼-- · 2019-07-15 04:37
 精彩回答 2  元偷偷看……
追梦听雨
2楼-- · 2019-07-15 07:19
zhifubao 发表于 2016-8-5 21:55
这在HAL库中已经自动实现了。

HAL库只是听说过,没有用过,一直都是用标准库的,HAL库好用吗
追梦听雨
3楼-- · 2019-07-15 08:03
mhb520 发表于 2016-8-6 00:00
我记得STM32F103自身带的I2C有问题,不稳定,一般都是模拟I2C时序。

嗯,在网上看到相关的问题了,但是模拟的话好像是比较麻烦的吧
zhifubao
4楼-- · 2019-07-15 09:44
追梦听雨 发表于 2016-8-12 08:47
HAL库只是听说过,没有用过,一直都是用标准库的,HAL库好用吗

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

一周热门 更多>