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;
}这个问题困扰我好久了,请大家帮忙看一下,谢谢各位了!!!
终于搞清楚了,是在仿真或烧写的OPTIONS中配置复用功能,不需要在程序中写配置代码,好大一个坑啊,花了我一天时间 问题已经解决了...I2C是复用的GPIO的管脚,我没有设置这个GPIO为I2C导致的... ST的硬件I2C让人很头痛。还是用模拟的吧。简单的来而且还方便 支持一下 直接模拟吧 yh_terry 发表于 2015-6-9 15:33
问题已经解决了...I2C是复用的GPIO的管脚,我没有设置这个GPIO为I2C导致的...
请问具体怎么解决,遇到同样的问题。一直忙~~~ 没有设置这个GPIO为I2C导致的 直接在配置字中设置端口为I2C.然后不需要再进行GPIO设置 本帖最后由 xmshao 于 2018-1-9 22:52 编辑
相关I2C管脚的复用配置可以在STVP等编程工具里配置、也可以自己编程实现。一般用工具更方便点。
:):):):):):)
页:
[1]
2