使用I2C通信,设置的用自发自收模式,应该是循环发送,结果发完一次后,SCLK就被锁定了,详细状况可见附图(逻辑分析仪抓取的),以下是代码
void I2C0_Init()
{
puts("HI,I2C Init!");
//进入复位 IRS = 0
I2C0_MDR &= ~0x20;
//配置寄存器
//系统时钟 预分频器 225MHz / (21 + 1) = 10.25 MHz
I2C0_PSC = (0x15);
//I2C 时钟分频器 10.25 / (50) = 200KHz
I2C0_CLKL = (0x0013); //19+6 = 25
I2C0_CLKH = (0x0013); //19+6 = 25
//退出复位
I2C0_MDR |= (0x20); //IRS = 1
//5-配置主机地址
I2C0_OAR = 0x05;
//中断设置 -- 接收产生中断
// I2C0_IER = (1 << 3);
}
int I2C_WriteData(char addr, char *array, int count)
{
// int i;
char *p;
p = array;
//先前是否发送完成 检查SST位是否为1
if((I2C0_MDR & (0x01<<11)) == 1)
{
puts("previous not finished!");
return 0;
}
//从机地址
I2C0_SAR = addr;
I2C0_STR |= (1<<12);
//检查总线是否空闲 1:表示忙
if((I2C0_STR & (1<<12)))
{
return 0;
}
//计数器
I2C0_CNT = 2;
//发送开启
//进入复位 IRS = 0
I2C0_MDR |= 0x6E60;
//发送数据
while(I2C0_STR & (0x01<<1)); //ASK
while(!(I2C0_STR & (0x1<<4))); //ICXRDY
I2C0_DXR = *p++;
while(I2C0_STR & (0x01<<1));
while(!(I2C0_STR & (0x1<<4)));
I2C0_DXR = *p++;
//I2C0_MDR |= (0x1<<11);
return p-array;
}
主函数
void main()
{
// int i;
char data[2] = {5, 2};




