yh_terry 发表于 2015-6-8 20:32:26

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;
}这个问题困扰我好久了,请大家帮忙看一下,谢谢各位了!!!

meisk 发表于 2017-5-24 17:41:24

终于搞清楚了,是在仿真或烧写的OPTIONS中配置复用功能,不需要在程序中写配置代码,好大一个坑啊,花了我一天时间

yh_terry 发表于 2015-6-9 15:33:05

问题已经解决了...I2C是复用的GPIO的管脚,我没有设置这个GPIO为I2C导致的...

ts2000 发表于 2015-6-9 10:20:38

ST的硬件I2C让人很头痛。还是用模拟的吧。简单的来而且还方便

jacobfeng 发表于 2015-6-11 20:47:04

支持一下

为什么是EEFOCUS小白 发表于 2015-6-13 15:14:15

直接模拟吧

saefra 发表于 2015-11-11 11:25:49

yh_terry 发表于 2015-6-9 15:33
问题已经解决了...I2C是复用的GPIO的管脚,我没有设置这个GPIO为I2C导致的...

请问具体怎么解决,遇到同样的问题。一直忙~~~

foxglove 发表于 2015-11-11 14:42:43

没有设置这个GPIO为I2C导致的

天行健01 发表于 2016-1-14 14:34:22

直接在配置字中设置端口为I2C.然后不需要再进行GPIO设置

xmshao 发表于 2016-1-16 11:57:30

本帖最后由 xmshao 于 2018-1-9 22:52 编辑


相关I2C管脚的复用配置可以在STVP等编程工具里配置、也可以自己编程实现。一般用工具更方便点。

zcl201207 发表于 2016-1-16 20:40:53

:):):):):):)
页: [1] 2
查看完整版本: stm8s I2C总线总是处于忙状态