|
发表于 2023-11-24 17:23:01
|
显示全部楼层
#define SDA_INPUT_SET() {GPIOB->MODER&=~(3<<(7*2));GPIOB->MODER|=0<<7*2;} //PB5输入模式
#define SDA_OUTPUT_SET() {GPIOB->MODER&=~(3<<(7*2));GPIOB->MODER|=1<<7*2;} //PB5输出模式
#define SCL_INPUT_SET() {GPIOB->MODER&=~(3<<(7*2));GPIOB->MODER|=0<<7*2;} //PB5输入模式
#define SCL_OUTPUT_SET() {GPIOB->MODER&=~(3<<(7*2));GPIOB->MODER|=1<<7*2;} //PB5输出模式
void iic_start(void)
{
SDA_INPUT_SET();
while(READ_RDY_STATUS()==0)
{
}
SCL_INPUT_SET();
while(READ_SCL_STATUS()==0)
{
}
SDA_OUT();
IIC_SDA(0);
iic_delay();
SCL_OUT();
IIC_SCL(0); /* 钳住I2C总线,准备发送或接收数据 */
iic_delay();
//iic_delay();
}
/**
* @brief 产生IIC停止信号
* @param 无
* @retval 无
*/
void iic_stop(void)
{
SDA_OUTPUT_SET();
IIC_SDA(0); /* STOP信号: 当SCL为高时, SDA从低变成高, 表示停止信号 */
iic_delay();
//IIC_SCL(1);
SCL_INPUT_SET();
while(READ_SCL_STATUS()==0)
{
}
iic_delay();
SDA_INPUT_SET();
while(READ_SDA_STATUS()==0)
{
}
//IIC_SDA(1); /* 发送I2C总线结束信号 */
// iic_delay();
}
我修改了大概的一些代码,把主动输出的更改为设置输入,等待为高。更完善的代码是增加超时结束,返回对应的出错码。其他主动输出为高的地方都设置为输入 等待为高后延时2uS或者读完数据后输出低就行。 |
|