现自己写了一份基于STM8s库函数的I2C代码,遇到一个问题,在读取数据的时候,在时序的重发起始信号后,SDA线就始终为低了,不知道如何解决 ,还请大神指点!暂时不要叫我用软件模拟
现附上代码:
#define IIC_Frequency 100000
#define IIC_InFrequency 4
#define IIC_salveaddr 0xDE
void SingleGSM_IIC_init(void)
{
CLK_PeripheralClockConfig(CLK_PERIPHERAL_I2C,ENABLE);
GPIO_Init(GPIOE,GPIO_PIN_1,GPIO_MODE_OUT_OD_HIZ_SLOW);
GPIO_Init(GPIOE,GPIO_PIN_2,GPIO_MODE_OUT_OD_HIZ_SLOW);
I2C_DeInit();
I2C_Init(IIC_Frequency,0x0001,I2C_DUTYCYCLE_2,I2C_ACK_CURR,I2C_ADDMODE_7BIT,IIC_InFrequency);
I2C_Cmd(ENABLE);
}
void SingleGSM_IIC_write(uint8_t addr,uint8_t data)
{
while(I2C_GetFlagStatus(I2C_FLAG_BUSBUSY));
I2C_GenerateSTART(ENABLE);
while(!(I2C->SR1 & 0x01));
// while(!(I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT)));
I2C_Send7bitAddress(0xDE,I2C_DIRECTION_TX);
while(!(I2C->SR1 & 0x02));
I2C->SR1;
I2C->SR3;
// while(!(I2C_CheckEvent(I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)));
I2C_SendData(addr);
while(!(I2C->SR1 & 0x80));
// I2C->SR1;
// I2C->SR3;
// while(!(I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_SendData(data);
while(!(I2C->SR1 & 0x84));
// while(!(I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_GenerateSTOP(ENABLE);
}
uint8_t SingleGSM_IIC_read(uint8_t addr)
{
uint8_t data;
while(I2C_GetFlagStatus(I2C_FLAG_BUSBUSY));
I2C_GenerateSTART(ENABLE);
while(!(I2C->SR1 & 0x01));
// while(!(I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT)));
I2C_Send7bitAddress(IIC_salveaddr,I2C_DIRECTION_TX);
while(!(I2C->SR1 & 0x02));
I2C->SR1;
I2C->SR3;
// while(!(I2C_CheckEvent(I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)));
// while(!(I2C->SR1 & 0x80))
I2C_SendData(addr);
while(!(I2C->SR1 & 0x80));
// I2C->SR1;
// I2C->SR3;
// while(!(I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED)));
I2C_GenerateSTART(ENABLE);/*********SDA信号执行完这一步后再也不能变高************/
while(!(I2C->SR1 & 0x01));
// while(!(I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT)));
I2C_Send7bitAddress(IIC_salveaddr,I2C_DIRECTION_RX);
I2C->SR1;
I2C->SR3;
// while(!(I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_RECEIVED)));
while(!(I2C->SR1 & 0x40));
I2C_AcknowledgeConfig(I2C_ACK_NONE);
I2C_GenerateSTOP(ENABLE);
data=I2C_ReceiveData();
I2C_AcknowledgeConfig(I2C_ACK_CURR);
I2C_GenerateSTOP(ENABLE);
return data;
}
不知道为什么手册上说发送地址的话 I2C->SR1的数据寄存器为空是不置位的-----------在发送数据时,数据寄存器为空时该位被置’1’,在发送地址阶段不设置该位。然而我看发送7位地址时仍然置位了,而且发送地址之后,再发送寄存器地址数据,SR1的字节发送结束位永远不置位,不知道怎么回事
不知道为什么手册上说发送地址的话 I2C->SR1的数据寄存器为空是不置位的-----------在发送数据时,数据寄存器为空时该位被置’1’,在发送地址阶段不设置该位。然而我看发送7位地址时仍然置位了,而且发送地址之后,再发送寄存器地址数据,SR1的字节发送结束位永远不置位,不知道怎么回事
我是一头搞电子的猪,猪是一种好色的动物,猪八戒就是代表.
之前一直听说,stm8的硬件iic有问题,所以建议先用软件模拟iic实现呢。。。
后来,我用F4的时候,硬件iic好像也没有出过问题呢。。。。。。