求助各位大大,我使用的是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;
- }
复制代码 这个问题困扰我好久了,请大家帮忙看一下,谢谢各位了!!!
|
请问具体怎么解决,遇到同样的问题。一直忙~~~
相关I2C管脚的复用配置可以在STVP等编程工具里配置、也可以自己编程实现。一般用工具更方便点。
大神在九楼
顺便问一句 STM8的I2C是真开漏输出的么
1、有了I2C_Cmd(ENABLE);还需要CLK_PeripheralClockConfig(CLK_PERIPHERAL_I2C, ENABLE);吗?
2、I2C_Init(I2C_MAX_STANDARD_FREQ, I2C_SLAVE_ADDRESS, //这里不应该是从机地址吧?
I2C_DUTYCYCLE_2, I2C_ACK_CURR,
I2C_ADDMODE_7BIT, Input_Clock);
3、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);
管脚配置需要吗?
我现在也是判断状态死循环啊,求助!
这位大神,能不能教下怎么设置烧写和仿真的复用功能