深圳市航顺芯片技术研发有限公司
直播中

王莉

7年用户 1260经验值
私信 关注
[问答]

如何使用I2C总线来控制EEPROM芯片

I2C总线是什么?

如何使用I2C总线来控制EEPROM芯片?有哪些步骤?

回帖(1)

张超

2021-10-19 16:17:28
  I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息。
  这里使用的是G071RB开发板,已经自带有24C08A芯片,是一个8K的EEPROM芯片,使用I2C总线来控制这个芯片,写入数据。
  实验步骤
  1、CubeMx中芯片选择STM32G071RBTx,新建工程
  2、开启SWD调试、HSE
  
  
  3、开启USART1 ,设置波特率115200、8bit、None(无奇偶检验)、停止位1
  
  4、 设置PB5为推挽输出模式,默认上拉,用于控制eeprom的WP引脚
  
  
  5、 选择PB7引脚,设置为I2C1_SDA,PB6设置为I2C_SCL,再激活I2C1,I2C Speed Moed选择:Standard Mode(标准模式),其他保持默认参数
  
  6、设置时钟树,HCLK=64MHz
  
  7、在工程管理里面,设置好参数,生成代码使用MDK打开。
  
  
  代码部分
  1、在Debug选项卡中,Flash Download勾上“Reset and Run”
  2、添加printf打印代码,在usart.c文件添加如下代码
  /* USER CODE BEGIN 0 */
  #include 《stdio.h》
  /* USER CODE BEGIN 0 */
  #ifdef __GNUC__
  /* With GCC/RAISONANCE, small printf (option LD Linker-》Libraries-》Small printf
  set to ‘Yes’) calls __io_putchar() */
  #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
  #else
  #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
  #endif /* __GNUC__ */
  /**
  * @brief Retargets the C library printf function to the USART.
  * @param None
  * @retval None
  */
  PUTCHAR_PROTOTYPE
  {
  /* Place your implementation of fputc here */
  /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
  return ch;
  }
  /* USER CODE END 0 */
  3、设置24C08A的地址
  这里用的是8K的芯片,所以有P1,P0位(
  
  ),有4个块区域,每个区域有256字节。
  
  ,这就是8K芯片。A0表示第一块256字节的设备地址,A2表示第二块256字节的设备地址,A4表示第三块256字节的设备地址,A6表示第四块256字节的设备地址
  
  在i2c.h文件中添加如下代码
  /* USER CODE BEGIN Includes */
  #define ADDR_24LC08_WRITE 0XA0 //设备地址和写指令
  #define ADDR_24LC08_READ 0XA1 //设备地址和读指令
  #define BufferSize 15
  /* USER CODE END Includes */
  4、在main.c文件中添加如下代码
  /* USER CODE BEGIN Includes */
  #include 《stdio.h》
  #include 《string.h》
  uint16_t i;
  /* USER CODE END Includes */
  int main(void)
  {
  *
  *
  *
  /* USER CODE BEGIN 2 */
  uint8_t writerbuff[BufferSize]=“This is a test.”;
  uint8_t readbuff[BufferSize];
  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET); //下拉引脚,激活eeprom芯片
  if(HAL_I2C_Mem_Write(&hi2c1,ADDR_24LC08_WRITE,0,I2C_MEMADD_SIZE_8BIT,writerbuff,BufferSize,0x10)==HAL_OK)
  printf(“Write succeeded.rn”);
  else
  printf(“Write failed.rn”);
  HAL_Delay(5); //等待芯片写周期完成
  HAL_I2C_Mem_Read(&hi2c1,ADDR_24LC08_READ,0,I2C_MEMADD_SIZE_8BIT,readbuff,BufferSize,0x10);
  printf(“The data in the chip is as follows:rn”);
  for(i=0;i《BufferSize;i++) //读取的数据通过串口打印出来
  {
  printf(“%c”,readbuff[i]);
  }
  if(memcmp(writerbuff,readbuff,BufferSize)==0) //对比写入数据与读取数据是否一致
  printf(“rnVerification succeeded.rn”);
  else
  printf(“rnVerification failed.rn”);
  *
  *
  *
  }
  5、编译好固件后,烧录进去芯片。串口输出如下
  
举报

更多回帖

发帖
×
20
完善资料,
赚取积分