两个问题:
1,这个读取SDA和SCL状态是读ODR还是读IDR呢?
#define I2C_SDA_State GPIOB->ODR&GPIO_Pin_6//SDA状态
#define I2C_SCL_State GPIOB->ODR&GPIO_Pin_7//SCL状态
2,字节接收部分中,I2C_SDA_State一直为低,所以ReData|=0x01一直不执行,读出来的全部是0。大家看看哪里有问题啊?
if(I2C_SDA_State) //读SDA引脚状态
{
ReData|=0x01; //如果SDA为高则将SDA上的数据存入ReData
}
引脚定义部分:
#define SDA_1 GPIO_SetBits(GPIOB,GPIO_Pin_6)//SDA置1
#define SDA_0 GPIO_ResetBits(GPIOB,GPIO_Pin_6)//SDA置0
#define SCL_1 GPIO_SetBits(GPIOB,GPIO_Pin_7)//SCL置1
#define SCL_0 GPIO_ResetBits(GPIOB,GPIO_Pin_7)//SCL置0
#define I2C_SDA_State GPIOB->ODR&GPIO_Pin_6//SDA状态
#define I2C_SCL_State GPIOB->ODR&GPIO_Pin_7//SCL状态
I2C接收字节部分:
u8 I2C_ReceiveByte(void)//接收一个字节
{
u8 i,ReData;
SDA_1;//接收方释放SDA总线
SCL_0;//让从机准备好数据
ReData=0;
for(i=0;i<8;i++)
{
SCL_1;//SCL=1使数据有效 ,SCL为高期间SDA需保持稳定
I2C_delay();
ReData<<=1;
if(I2C_SDA_State) //读SDA引脚状态
{
ReData|=0x01; //如果SDA为高则将SDA上的数据存入ReData
}
SCL_0;//准备好再次接收数据,SCL为低才允许SDA变化
I2C_delay();//等待数据准备好
}
return ReData;
}
| | |
|