程序代码如下:
初始化后寄存器如下:起始地址是0x40005800
00000001 00000024 00004000 00000000
00000000 00000000 00000000 00000708
00000035
我不喜欢用提供的函数,比较耗时间,自己写的简洁。
初始化后,寄存器内容正常。但是第一次运行到下面的函数就会死在这里。
void I2C_WRITE(INT16U ADDR,INT16U DATA)
{
INT16U i ;
// I2C_EE_WaitEepromStandbyState();//,网络获得的函数,开放出来,仍然会死在这里。
if((I2C2->SR2 & 0x0002) != 0x0002) //总线不忙
{
// I2C2->CR1 |= 0x0100 ;//自己写的函数,此步完成后监视寄存器内BUSY和START置1,
I2C_GenerateSTART(I2C2,ENABLE); //打开I2C,开始发送过程
// while((I2C2->SR1 & 0x0001) != 0x0001) //等待SB置位,会死在这里,
// {;
// }
while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT)); //设置主机模式,也是死在这里,不知为何。
//以下的部分不能运行到。
I2C2->DR = 0x00A0 ; //写要发送的从设备地址;
while((I2C2->SR1 & 0x0002) != 0x0002) //等待ADDR置位
{;
}
i = I2C2->SR2 ;//清除ADDR位
I2C2->DR = (ADDR >> 0x08); //写要发送的地址H;
while((I2C2->SR1 & 0x0004) != 0x0004) //等待BTF置位
{;
}
I2C2->DR = (ADDR & 0xFF); //写要发送的地址L;
while((I2C2->SR1 & 0x0004) != 0x0004) //等待BTF置位
{;
}
I2C2->DR = (DATA>> 0x08) ; //写要发送的数据H;
while((I2C2->SR1 & 0x0004) != 0x0004) //等待BTF置位
{;
}
I2C2->DR = (DATA & 0xFF); //写要发送的数据L;
while((I2C2->SR1 & 0x0004) != 0x0004) //等待BTF置位
{;
}
I2C2->CR1 |= 0x0200 ; //STOP位
for(i=0;i<4000;i++);
}
}
我觉得无论是那种I2C芯片,应该都没有问题,所有请教高手指点。 |