IIC_中断实现方式

#include "IIC.h"
#include "iostm8l152k4.h"
#include "Interrupt.h"
#include "stdbool.h"
#include "stdint.h"
#include "BC95ATCmd.h"
#include "MAG3110.h"
/********************************************/
unsigned char IICWriteReg;
unsigned char IICWriteData;

unsigned char IICReadNum;
unsigned char IICReadReg;
unsigned short addrIICReadWrite;

unsigned char IICReadDataBuf[6];//用于数据的处理
unsigned char* IICReadDataPtr;

unsigned char IICReadBuf[6];//用于数据接收
unsigned char* IICReadPtr;

unsigned char IICTimeOut=0;//IIC总线超时计数器

bool bIIC_finished=false;//用于IIC防锁死
bool bIICTimeOutEnable=false;//IIC超时计数器使能位
//bool bIICDataReady=false;//数据准备就绪.

extern void Init_IIC(void);

__root void WriteOneByte_ST(unsigned char addr,unsigned char data)
{
unsigned char i;
unsigned char Temp;
if((!I2C1_SR3_BUSY))
{//总线锁死状态
IICWriteReg=addr;
IICWriteData=data;
bIICTimeOutEnable=true;
IICTimeOut=0;//超时时长为1--2次TIM4中断
bIIC_finished=false;
addrIICReadWrite=(unsigned short)WriteOneByte_SB_Handler;
I2C1_CR1_PE=1;
I2C1_CR2 |= 0x04;//开启应答
I2C1_CR2_START=1;
}
else
{//解锁死
/*
if(IIC_Err_Handler())
{//解锁成功
bMagFlag=true;
}
else
{
Temp=I2C1_SR2;
}
*/
}
}
__root void WriteOneByte_SB_Handler(void) //Start bit sent
{
if((I2C1_SR1_SB))
{
addrIICReadWrite=(unsigned short)WriteOneByte_ADDR_Handler;
I2C1_DR=MAG3110_IIC_ADDRESS; //写地址
}
}

__root void WriteOneByte_ADDR_Handler(void) //ADDR中断 7位器件地址发送完
{
unsigned char temp;
if(I2C1_SR1_ADDR)
{
addrIICReadWrite=(unsigned short)WriteOneByte_BTF1_Handler;
temp = I2C1_SR1;
temp = I2C1_SR3;
I2C1_DR = IICWriteReg;
}
}
__root void WriteOneByte_BTF1_Handler(void) //IIC BTF
{
if(I2C1_SR1_BTF)
{
addrIICReadWrite=(unsigned short)WriteOneByte_BTF2_Handler;
I2C1_DR = IICWriteData;
}
}
__root void WriteOneByte_BTF2_Handler(void) //IIC BTF
{
I2C1_CR2 |= 0x02; //产生停止位
I2C1_CR2 |= 0x04; //返回应答
bIIC_finished=true;
bIICTimeOutEnable=false;
I2C1_CR1_PE=0;
}

__root void ReadOneByte_BTF1_Handler(void)
{
unsigned char temp;
unsigned int i;


//1 if((I2C1_SR1 & 0x40))//
{
// I2C1_CR2 |= 0x04;//开启应答
temp = I2C1_SR1;//
*IICReadPtr++ =I2C1_DR; //读取数据同时清除BTF位
IICReadNum--;
}
if(IICReadNum==1)
{
I2C1_CR2 &= ~0x04; //不返7回应答, ???产生非应答信号?
I2C1_CR2 |= 0x02; //产生停止位
}
if(IICReadNum==0)
{
// I2C1_CR2 |= 0x02

; //产生停止位,产生停止位会使得BTF位被清零
I2C1_CR2 |= 0x04;//开启应答
// I2C1_CR2 &= ~0x08;
bIICTimeOutEnable=false;//
bIIC_finished=true;//
I2C1_CR1_PE=0;//
}
}

__root void ReadOneByte_ADDR2_Handler(void)
{
unsigned char temp;
if((I2C1_SR1_ADDR))
{
addrIICReadWrite=(unsigned short)ReadOneByte_BTF1_Handler;
temp = I2C1_SR1;
temp = I2C1_SR3;
if(IICReadNum==1)
{
I2C1_CR2 &= ~0x04; //不返7回应答, ???产生非应答信号?
I2C1_CR2 |= 0x02; //产生停止位
}
}

}
__root void ReadOneByte_SB2_Handler(void) //IIC SB
{

if((I2C1_SR1_SB))
{
addrIICReadWrite=(unsigned short)ReadOneByte_ADDR2_Handler;
I2C1_DR = MAG3110_IIC_ADDRESS+1; //读
}

}
__root void ReadOneByte_BTF_Handler(void) //BTF=1会产生中断吗???
{
// CTR=0;
if(I2C1_SR1_BTF)
// if(I2C1_SR1_TXE)
{
addrIICReadWrite=(unsigned short)ReadOneByte_SB2_Handler;
I2C1_CR2 |= 0x01; //产生重复起始位
}

}
__root void ReadOneByte_ADDR_Handler(void)
{
unsigned char temp;
if(I2C1_SR1_ADDR)
{
addrIICReadWrite=(unsigned short)ReadOneByte_BTF_Handler;
temp = I2C1_SR1;
temp = I2C1_SR3;//清除ADDR位
I2C1_DR=IICReadReg;//发送要读的数据的地址位
}
}
__root void ReadOneByte_SB_Handler(void) //IIC SB
{
if((I2C1_SR1_SB))
{
addrIICReadWrite=(unsigned short)ReadOneByte_ADDR_Handler;
I2C1_DR=MAG3110_IIC_ADDRESS;
}
}
__root void ReadOneByte_ST(unsigned char IICReg,unsigned char IICNum)
{
unsigned char Temp;
IICReadReg=IICReg;
IICReadNum=IICNum;
IICReadPtr=IICReadBuf;
bIIC_finished=false;
bIICTimeOutEnable=true;
IICTimeOut=0;//超时时长为1--2次TIM4中断
if(!I2C1_SR3_BUSY)
{//
addrIICReadWrite=(unsigned short)ReadOneByte_SB_Handler;
I2C1_CR1_PE=1;
I2C1_CR2 |= 0x04;//开启应答
I2C1_CR2_START=1;
}
else
{/*
IIC_Err_Handler();
bMagFlag=true;
*/
}

}

void IICDelay(void)
{

}

unsigned char IIC_Err_Handler(void)
{//用于IIC锁死的情况
unsigned char j=0,err_sta=0,temp;
unsigned int i=0;
// I2C1_CR2_STOP=1;
// I2C1_CR2_SWRST=1;
// I2C1_CR2_SWRST=0;

// I2C1_CR2 |= 0x02; //产生停止位
// I2C1_SR2=0;//清除错误

I2C1_CR1_PE=0;
// bIICTimeOutEnable=false;//关闭IIC超时
//1.配置IO口为开漏输出
PC_DDR |= 0x03;//PC0(SDA),PC1(SCL)设置为输出
PC_CR1 &=0xFC; //PC0(SDA),PC1(SCL)设置为开漏输出
// PC_ODR |=0X03;// ,PC1(SCL)输出高电平
//2.产生9个以上10us脉宽时钟 PC1(SCL)
while(!PC_IDR_IDR0)
{
if(PC_IDR_IDR0)
{
PC_ODR_ODR1

=1;
break;
}
else PC_ODR_ODR1^=1;
for(i=0;i<40;i++);
}
I2C1_CR2_SWRST=1;
I2C1_CR2_SWRST=0;
//3.切换回IIC,并产生停止时序
PC_DDR &=0xFE;
I2C1_CR1_PE=1;
// I2C1_CR2 |= 0x02; //产生停止位
for(i=0;i<100;i++);
bMagFlag=true;
/*
while(I2C1_SR3_BUSY)
{
temp=0;
}
*/
// PC_ODR_ODR1=1;//PC1(SCL)=1;
// PC_ODR_ODR0=0;
// for(i=0;i<160;i++);
// PC_ODR_ODR0=1;
//3.将 SCL 的 SDA 切换回I2C接口;
/*
//4.判断是否成功
if(!I2C1_SR3_BUSY)
// if(1)
{//解锁死成功
PC_DDR &=0xFC;//PC0(SDA),PC1(SCL)设置为输入
// Init_IIC(); //wzc初始化IIC
I2C1_CR2_SWRST=1;
I2C1_CR2_SWRST=0;
I2C1_CR1_PE=1;
return 1;
}
else
{//解锁死失败
return 0;
}
*/

}


相关文档
最新文档