开发stm8,一直都用的是stvd,但是发现很多例程到使用iar,就转到iar开发。
现在项目上用到IIC从机的问题,也看了挺多人写的硬件IIC从机程序,都运行无问题,于是自己也仿照着写了从机程序
这个程序和他人能用的程序仔细比对过,流程都是一样的(他人用的stm8l不是我用的这个型号,但是这个应该不碍事),选项字节也检查了没有问题
无奈就是不工作,也进不了iic中断。
(IIC硬件接口是PC0 PC1)
贴出初始化代码,还请高人指导一下:
void CLK_init(void)
{
CLK_DeInit();
CLK_MasterPrescalerConfig(CLK_MasterPrescaler_HSIDiv1);
CLK_PeripheralClockConfig(CLK_Peripheral_I2C, ENABLE);
CLK_PeripheralClockConfig(CLK_Peripheral_SPI, ENABLE);
}
void IIC_init(void)
{
I2C_DeInit(); //占空比1/2 //使能应答 //7位地址
I2C_Init(100000, 0X69, I2C_DutyCycle_2, I2C_Ack_Enable, I2C_AcknowledgedAddress_7bit); //标准速度200K,本机地址0X62
GPIO_Init(GPIOC, GPIO_Pin_0 | GPIO_Pin_1, GPIO_Mode_In_FL_No_IT);
//开启错误中断、事件中断(如匹配了地址,接收了一字节数据)、BUF中断(接收和发送相关)
I2C_ITConfig(I2C_IT_ERR | I2C_IT_EVT | I2C_IT_BUF, ENABLE);
//I2C_ClearFlag(I2C_IT_ERR | I2C_IT_EVT | I2C_IT_BUF); //清除一下标志
enableInterrupts(); //开启所有中断
I2C_Cmd(ENABLE);
}
中断程序在这里(我在中断里面加入了LED取反的操作,已拿掉,但是用主机发送IIC寻址信号,发现并没有进入中断)
INTERRUPT_HANDLER(I2C_IRQHandler, 29)
{
uint8_t temp = 0;
if(I2C->SR1&0x02) //地址已经匹配 ADDR标志
{
//temp = I2C->SR3&0x07;
(void)(I2C->SR3); //再读SR3,清除ADDR
if((I2C->SR3)&0x04) //如果是读操作
{
I2C->DR = 0XAA;
}
}
else if((I2C->SR3)&0x04) //如果是接收状态
{
if((((I2C->SR1)&0x80) == 0X80))
{
//I2C->DR = Test_read[Test_r_pos ];
//Test_r_pos ++;
}
}
else if(((I2C->SR1)&0x40)&&(!((I2C->SR3)&0x04))) //从机接收数据
{
temp = I2C->DR;
}
else if((I2C->SR1)&0x10) //检测到停止位
{
//检测到停止位----清除停止位---通过写CR2
I2C->CR2 = I2C->CR2;
}
// 错误管理
if((I2C->SR2)&0X0F) //IIC出现错误
{
I2C->SR2 &= ~(0X0F); //清零
}
}
敬请指教! |