这是我发送的程序:
void IIC_Init(void)
{
I2C_FREQR = 0x0a; //外设时钟频率10M
I2C_CCRH = 0x03; //
I2C_CCRL = 0xe8; //10KHZ
I2C_TRISER = 0x04; //上升时间
I2C_CR2 |=0x04; //收到一个字节后应答
I2C_CR1 |=0x01; //启用IIC模块
I2C_OARH=0x40;
I2C_OARL=0x03;
}
//主模式下的发送
void IIC_Host_TX(uchar add,uchar data)
{
uchar temp;
while(I2C_SR3 & 0x02); //等待总线空闲
UART_Send(2);
I2C_CR2 |= 0x01; //产生起始位
while(!(I2C_SR1 & 0x01)); //等待起始位发送完成
UART_Send(3);
I2C_DR = add; //写入器件地址
while(!(I2C_SR1&0x02)); //等待器件地址发送结束
UART_Send(4);
temp = I2C_SR1;
temp = I2C_SR3;
I2C_DR =data; //发送数据
while(!(I2C_SR1 & 0x84)); //等待数据字节发送完成
UART_Send(5);
I2C_CR2 |= 0x02; //产生停止位
}
这是我接收的程序:
void IIC_Init(void)
{
I2C_ITR=0x06;
I2C_FREQR = 0x0a; //外设时钟频率10M
I2C_CCRH = 0x03; //
I2C_CCRL = 0xe8; //10KHZ
I2C_TRISER = 0x04; //上升时间
I2C_CR2 |=0x04; //收到一个字节后应答
I2C_CR1 |=0x01; //启用IIC模块
I2C_OARH=0x40;
I2C_OARL=0x02;
}
#pragma vector=0x15
__interrupt void I2C_IRQHandler(void)
{
UART_Send(1);
if(I2C_SR1&0x02) //地址匹配
{
UART_Send(2);
temp = I2C_SR1;
temp = I2C_SR3;
}
if(I2C_SR1&0x40) //接收数据寄存器非空
{
UART_Send(3);
IIC_Data=I2C_DR;
UART_Send(IIC_Data);
}
if(I2C_SR1&0x10) //检测到停止位
{
UART_Send(4);
I2C_CR2|=0x02; //释放总线
}
}
发送在 while(!(I2C_SR1&0x02)); //等待器件地址发送结束 这里就卡了
接收只打印了1和4, |