STM32
直播中

史晓明

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

stm8s I2C总线总是处于忙状态是怎么回事?

求助各位大大,我使用的是STM8S103K3,想要使用stm8通过I2C控制一个LCD的驱动芯片,在I2C写的时候,判断bus是否处于忙状态的循环无法跳出,通过示波器量I2C总线的时候是高电平。目前怀疑是自己I2C初始化不正确,但网上有的说要设置GPIO PIN,有的说不需要,请问一下I2C的初始化到底要怎么初始化?下面是我的代码:

  • #define I2C_SLAVE_ADDRESS        0x7C
  • #define I2C_PORT         GPIOB
  • #define I2C_SDA_PIN         GPIO_PIN_4
  • #define I2C_SCL_PIN         GPIO_PIN_5
  • void main(void)
  • {
  •     GPIO_Init(I2C_PORT, I2C_SDA_PIN, GPIO_MODE_OUT_OD_HIZ_SLOW);
  •     GPIO_Init(I2C_PORT, I2C_SCL_PIN, GPIO_MODE_OUT_OD_HIZ_SLOW);
  •     CLK_PeripheralClockConfig(CLK_PERIPHERAL_I2C, ENABLE);
  •     I2C_EEInit();
  • }


  • void Init_I2C(void)
  • {
  •         /* 复位设备 */
  •         I2C_DeInit();
  •         /* 初始化设备 */
  •         I2C_EEInit();
  • }


  • void I2C_EEInit(void)
  • {
  •         u8 Input_Clock = 0x0;
  •         Input_Clock = CLK_GetClockFreq() / 1000000;

  •         /* I2C Peripheral Enable */
  •         I2C_Cmd(ENABLE);

  •         /* Apply I2C configuration after enabling it */
  •         I2C_Init(I2C_MAX_STANDARD_FREQ, I2C_SLAVE_ADDRESS,
  •                          I2C_DUTYCYCLE_2, I2C_ACK_CURR,
  •                          I2C_ADDMODE_7BIT, Input_Clock);
  • }


  • void I2C_EE_ByteWrite(u8 u8CmdType, u8 *pu8Buffer, u8 u8WriteAddr)
  • {
  •         /* while the bus is busy */
  •         while (I2C_GetFlagStatus(I2C_FLAG_BUSBUSY))
  •         {
  •         }


  •         /* Send start condition */
  •         I2C_GenerateSTART(ENABLE);

  •         /* Test on EV5 and clear it */
  •         while(!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT))
  •         {
  •         }

  •         /* Send devices address for write */
  •         I2C_Send7bitAddress(I2C_SLAVE_ADDRESS, I2C_DIRECTION_TX);

  •         /* Test on EV6 and clear it */
  •         while(!I2C_CheckEvent(I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))
  •         {
  •         }

  •         /* Send cmd type be written */
  •         I2C_SendData(u8CmdType);

  •         /* Test on EV8 and clear it */
  •         while(!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTING))
  •         {
  •         }

  •         /* Send Address to be written   wait event detection */
  •         I2C_SendData(u8WriteAddr);

  •         /* Test on EV8 and clear it */
  •         while(!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTING))
  •         {

  •         }

  •         if (u8CmdType == 0x80)
  •         {
  •                 /* Send the byte to be written */
  •                 I2C_SendData(*pu8Buffer);

  •                 /* Test on EV3 and clear it */
  •                 while(!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTING))
  •                 {

  •                 }
  •         }

  •         /* Send stop condition */
  •         I2C_GenerateSTOP(ENABLE);
  •         return;
  • }

这个问题困扰我好久了,请大家帮忙看一下,谢谢各位了!!!

回帖(1)

云甫太

2024-4-22 15:25:23
I2C是复用的GPIO的管脚,没有设置这个GPIO为I2C导致的
举报

更多回帖

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