打印
[其他]

MindSDK下i2c读写24C02测试

[复制链接]
507|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
硬件电路
开发板上I2C硬件电路



使用PC6和PC7端口的I2C1接口



* 程序部分

引脚配置
void BOARD_InitPins(void)
{
  /* PB6 - UART1_TX. */
  GPIO_Init_Type gpio_init;
  gpio_init.Pins  = GPIO_PIN_6;
  gpio_init.PinMode  = GPIO_PinMode_AF_PushPull;
  gpio_init.Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOB, &gpio_init);
  GPIO_PinAFConf(GPIOB, gpio_init.Pins, GPIO_AF_7);

  /* PB7 - UART1_RX. */
  gpio_init.Pins  = GPIO_PIN_7;
  gpio_init.PinMode  = GPIO_PinMode_In_Floating;
  gpio_init.Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOB, &gpio_init);
  GPIO_PinAFConf(GPIOB, gpio_init.Pins, GPIO_AF_7);

  /* PC6 - I2C1_SCL. */
  gpio_init.Pins  = GPIO_PIN_6;
  gpio_init.PinMode  = GPIO_PinMode_AF_OpenDrain;
  gpio_init.Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOC, &gpio_init);
  GPIO_PinAFConf(GPIOC, gpio_init.Pins, GPIO_AF_4);

  /* PC7 - I2C1_SDA. */
  gpio_init.Pins  = GPIO_PIN_7;
  gpio_init.PinMode  = GPIO_PinMode_AF_OpenDrain;
  gpio_init.Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOC, &gpio_init);
  GPIO_PinAFConf(GPIOC, gpio_init.Pins, GPIO_AF_4);
}



main.c
int main(void)
{
      uint32_t i;
      uint8_t i2c_txdat[8];
      uint8_t i2c_rxdat[8];
  BOARD_Init();
      app_i2c_init();
  printf("\r\ni2c_master_basic example\r\n");

  /* Initialize I2C. */
      i2c_txdat[0] = 0x00;
      i2c_txdat[1] = 0x01;
      i2c_txdat[2] = 0x55;
      i2c_txdat[3] = 0xaa;
      i2c_txdat[4] = 0xff;
      i2c_txdat[5] = 0x5f;
      i2c_txdat[6] = 0xf5;
      i2c_txdat[7] = 0xaa;

      if( false == app_i2c_write(8, i2c_txdat) )
      {
          printf("I2C write failed.\r\n");
      }
      else
      {
          printf("write data: ");
          for (i = 0u; i < 8; i++)
          {
                  printf("0x%02X, ", i2c_txdat);
          }
          printf("\r\n");
      }

      if ( false == app_i2c_read(7, i2c_rxdat) )  /* Received data successfully. */
      {
              printf("I2C read failed.\r\n");
      }
      else
      {
          printf("read data: ");
          for (i = 0u; i < 7; i++)
          {
                  printf("0x%02X, ", i2c_rxdat);
          }
          printf("\r\n");
      }

      while(1);
}







初始化和收发代码
/* Initialize I2C */
void app_i2c_init(void)
{
  /* Setup I2C initialization values. */
  I2C_Master_Init_Type i2c_init;
  i2c_init.ClockFreqHz = BOARD_I2C_FREQ;
  i2c_init.BaudRate = I2C_BaudRate_100K;

  /* Initialize I2C master. */
  I2C_InitMaster(BOARD_I2C_PORT, &i2c_init);

  /* The target device address needs to be configured before enabling. */
  I2C_SetTargetAddr(BOARD_I2C_PORT, APP_I2C_TARGET_ADDR);

  /* Enable I2C. */
  I2C_Enable(BOARD_I2C_PORT, true);
}

/* Write data to target device, true to writing succeed, false to writing failed. */
bool app_i2c_write(uint8_t txlen, uint8_t *txbuf)
{
  app_i2c_xfer.WaitTimes = APP_I2C_TIMEOUT_TIME;
  app_i2c_xfer.TxBuf = txbuf;
  app_i2c_xfer.TxLen = txlen;

  I2C_Enable(BOARD_I2C_PORT, true);  /* Disable I2C to clear tx fifo, and enabled I2C to perform the write operation again. */
  if ( false == I2C_MasterWriteBlocking(BOARD_I2C_PORT, &app_i2c_xfer) )
  {
      return false;
  }
  else
  {
      return true;
  }
}

/* Read data to target device, true to reading succeed, false to reading failed. */
bool app_i2c_read(uint8_t rxlen, uint8_t *rxbuf)
{
  app_i2c_xfer.WaitTimes = APP_I2C_TIMEOUT_TIME;
  app_i2c_xfer.RxBuf = rxbuf;
  app_i2c_xfer.RxLen = rxlen;

  I2C_Enable(BOARD_I2C_PORT, true);  /* Disable I2C to clear tx fifo, and enabled I2C to perform the read operation again. */
  if ( false == I2C_MasterReadBlocking(BOARD_I2C_PORT, &app_i2c_xfer) )
  {
      return false;
  }
  else
  {
      return true;
  }
}


* 运行结果

开发板上电,先向地址0x00开始写8个字节的数据,在从地址0x00读出8个字节的数据。


————————————————
版权声明:本文为CSDN博主「极术社区」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_47569031/article/details/127427055

使用特权

评论回复
沙发
dspmana| | 2023-4-17 18:05 | 只看该作者
在测试24C02 EEPROM之前,需要确保设备和主控板的电源稳定并且电压正确。

使用特权

评论回复
板凳
sdlls| | 2023-4-18 12:25 | 只看该作者
通常需要编写相应的软件进行调试,以便对EEPROM进行读写操作。

使用特权

评论回复
地板
wwppd| | 2023-4-18 13:37 | 只看该作者
需要确保SCL和SDA线路正确连接,并且符合I2C标准要求。

使用特权

评论回复
5
earlmax| | 2023-4-18 13:48 | 只看该作者
在进行写入测试时,需要将测试数据正确地写入到EEPROM中。可以使用各种工具来生成测试数据,并将其以适当的格式写入EEPROM中。

使用特权

评论回复
6
updownq| | 2023-4-18 15:17 | 只看该作者
在接线过程中需要特别注意线路阻抗匹配问题、信号干扰和电缆长度等问题。

使用特权

评论回复
7
everyrobin| | 2023-4-18 15:56 | 只看该作者
24C02 EEPROM可以有多个I2C地址,因此在测试之前需要确认芯片的I2C地址是正确的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

148

主题

4100

帖子

5

粉丝