[KungFu32位 MCU] KF32F330KQV芯片的I2C无法进行通信

[复制链接]
 楼主| yzy1 发表于 2025-6-11 18:20 | 显示全部楼层 |阅读模式
按照芯片手册说明,在发起Start的时候标志位ISIF会置1,但是我在执行以下函数的时候会卡死在判断条件这里:
  1. // 清除I2C中断标志
  2.     I2C_Clear_INTERRUPT_Flag(I2C0_SFR);
  3.     // 启用I2C
  4.     I2C_Cmd(I2C0_SFR, TRUE);
  5.     // 生成I2C起始信号
  6.     I2C_Generate_START(I2C0_SFR, TRUE);
  7.     // 等待中断标志置位
  8.     while (!I2C_Get_INTERRUPT_Flag(I2C0_SFR))
  9.         ;

清除中断标志后启动I2C,在生成起始信号,按照芯片手册所描述应该会生成中断标志,但是在while循环这里死循环了,我使用的代码是官方提供的i2c eeprom的代码,
 楼主| yzy1 发表于 2025-6-11 18:25 | 显示全部楼层
而且,我在调试模式下查看对应的寄存器器的值是没有问题的,代码配置如下:
  1. #define I2C0_DRIVER_SFR      (GPIOC_SFR)
  2. #define I2C0_DRIVER_SCL_PIN  (GPIO_PIN_MASK_11)
  3. #define I2C0_DRIVER_SDA_PIN  (GPIO_PIN_MASK_12)
  4. #define I2C0_DRIVER_RMP      (GPIO_RMP_AF8_I2C0)

  5. void i2cDriver_Init(I2C_SFRmap *I2Cx, i2c_dirver_clk_t clk)
  6. {
  7. I2C_InitTypeDef I2C_InitStruct; // 定义I2C初始化结构体
  8. GPIO_InitTypeDef I2C_GPIO_InitStruct; // 定义GPIO初始化结构体
  9. I2C_GPIO_InitStruct.m_Mode = GPIO_MODE_RMP;                                 // 配置GPIO重映射功能
  10.         I2C_GPIO_InitStruct.m_OpenDrain = GPIO_POD_OD;                              // GPIO开漏输出
  11.         I2C_GPIO_InitStruct.m_Speed = GPIO_HIGH_SPEED;                              // IO配置为高速
  12.         I2C_GPIO_InitStruct.m_Pin = I2C0_DRIVER_SCL_PIN | I2C0_DRIVER_SDA_PIN;      // Px11 Px12
  13.         I2C_GPIO_InitStruct.m_PullUp = GPIO_PULLUP;                                 // 配置GPIO上拉
  14.         I2C_GPIO_InitStruct.m_PullDown = GPIO_NOPULL;                               // 不使能GPIO下拉
  15.         GPIO_Pin_RMP_Config(I2C0_DRIVER_SFR, I2C0_DRIVER_SCL_PIN, I2C0_DRIVER_RMP); // 配置PC11为I2C0 SCL
  16.         GPIO_Pin_RMP_Config(I2C0_DRIVER_SFR, I2C0_DRIVER_SDA_PIN, I2C0_DRIVER_RMP); // 配置PC12为I2C0 SDA
  17.         GPIO_Configuration(I2C0_DRIVER_SFR, &I2C_GPIO_InitStruct);                  // 配置GPIO
  18. I2C_Reset(I2Cx);                                   // 复位I2C外设
  19.     I2C_InitStruct.m_Mode = I2C_MODE_I2C;              // 设置I2C模式为I2C
  20.     I2C_InitStruct.m_ClockSource = I2C_CLK_SCLK;       // 选择SCLK作为时钟源,频率为120M
  21.     I2C_InitStruct.m_BADR10 = I2C_BUFRADDRESS_7BIT;    // 配置7位从机地址
  22.     I2C_InitStruct.m_MasterSlave = I2C_MODE_SMBUSHOST; // 设置SMBus类型为主机模式
  23. I2C_InitStruct.m_BaudRateL = 89; // 设置I2C波特率低电平时间周期,值不能小于3
  24.         I2C_InitStruct.m_BaudRateH = 89; // 设置I2C波特率高电平时间周期,值不能小于3
  25. I2C_InitStruct.m_AckEn = TRUE;              // 使能应答
  26.     I2C_InitStruct.m_AckData = I2C_ACKDATA_ACK; // 选择应答信号为ACK

  27.     I2C_Configuration(I2Cx, &I2C_InitStruct); // 配置I2C外设

  28.     I2C_Cmd(I2Cx, TRUE);            // 使能I2C模块
  29.     I2C_Clear_INTERRUPT_Flag(I2Cx); // 清I2C中断标志位
  30. }

因为KF32F330的主频是72M,所以重新计算了400k的时钟周期
钟爱柳州 发表于 2025-6-13 08:42 | 显示全部楼层
看看硬件连接图,示波器或逻辑分析仪抓一下SDA和SCL信号
钟爱柳州 发表于 2025-6-13 08:52 | 显示全部楼层
/**
  *   ##### 通用输入输出端口(GPIO)重映射配置函数 #####
  */
/**
  * 描述  配置GPIO端口引脚重映射。
  * 输入  GPIOx: 指向GPIO内存结构的指针,取值为GPIOA_SFR~GPIOH_SFR。
  *       GpioPinNum: 指定端口引脚,取值为GPIO_Pin_Num_0~GPIO_Pin_Num_15中的一个
**/
void GPIO_Pin_RMP_Config (GPIO_SFRmap* GPIOx, uint16_t GpioPinNum, uint8_t PinRemap)
这个函数的第二个参数是uint16_t GpioPinNum

而你的源代码是GPIO_PIN_MASK_11,重映射错了,将宏改一下再试试:
#define I2C0_DRIVER_SCL_PIN  (GPIO_Pin_Num_11)
#define I2C0_DRIVER_SDA_PIN  (GPIO_Pin_Num_12)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

2

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部