阻塞式写入, while(I2C1->STS2 & I2C_STS2_BUSY); //等待总线空闲
I2C1->CTRL1 |= I2C_CTRL1_STARTGEN ; //产生起始信号
while(!(I2C1->STS1 & I2C_STS1_STARTBF));//起始信号已发出
I2C1->DAT = WD_ADDR; //要读写器件的地址
while(!(I2C1->STS1 & I2C_STS1_ADDRF)); //地址发送结束
temp = I2C1->STS2; //读取一次清除标志位
I2C1->DAT = Addr>>8; //地址高字节
while(!(I2C1->STS1 & I2C_STS1_TXDATE)); //字节发送完毕
I2C1->DAT = Addr & 0x00FF;
while(!(I2C1->STS1 & I2C_STS1_TXDATE));
for(i=0; i<Num; i++)
{
I2C1->DAT = *(pBuffer+i);
while(!(I2C1->STS1 & I2C_STS1_TXDATE));
}
I2C1->CTRL1 |= I2C_CTRL1_STOPGEN; //发送停止位
稳定卡死在几个while处,但只要增加一条NOP之类的无关指令就不会卡死了。 |