📄 iic.c
字号:
#include <mc9s12e64.h> /* derivative information */
#include <hidef.h> /* common defines and macros */
#define NOP {__asm NOP; }
byte TxPacket[256]; // global transmit packet
char RxIndex=-1;
void IIC_Deal(void);
typedef struct IIC_Struct
{//IIC的各种属性
unsigned char address; //需要写入的地址值
unsigned char data; //写入的数据
unsigned char index; //接收缓冲区的存数偏置
unsigned char token; //0x00:初始化
//0xf0:报文接收完整
}IICserial;
IICserial IIC_RX[10]; //同时可以接收到的数据队列深度为三
// IIC 中断服务程序 //
void interrupt IIC_Program(void) {
byte DummyRead=0;
IBSR_IBIF=1; //首先清除该中断标志位
if(IBSR_IBAL==1) //如果有仲裁丢失发生
{
IBSR_IBAL=1; //首先清除该仲裁丢失指示位
if(IBSR_IAAS==1) //当作为从机地址匹配时
{
if(IBSR_SRW==1) //从机发送,主机向从机读取
{
if(IIC_RX[RxIndex].index==1)//表示接收到一个数据,为存储器中的地址
{
IBDR = TxPacket[IIC_RX[RxIndex].address];//把下一个要发送的字节写入数据寄存器中
if(RxIndex==9)
RxIndex=-1;
}
else
{
NOP; //没有接收到相应的地址,不做处理
}
}
else //从机接收,主机向从机发送数据
{
IBCR_TX_RX =0; //控制寄存器中,设置为接收模式
DummyRead=IBDR; //读一下数据寄存器,以便开始下一次接收
}
}
}
else //没有仲裁丢失时
{
if(IBSR_IAAS==1) //当作为从机地址匹配时
{
if(IBSR_SRW==1) //从机发送,主机向从机读取
{
IBCR_TX_RX=1; //控制寄存器中,设置为发送模式
if(IIC_RX[RxIndex].index==1)//表示接收到一个数据,为存储器中的地址
{
IBDR = TxPacket[IIC_RX[RxIndex].address];//把下一个要发送的字节写入数据寄存器中
if(RxIndex==9)
RxIndex=-1;
}
else
{
NOP; //没有接收到相应的地址,不做处理
}
}
else
{
IBCR_TX_RX =0; //控制寄存器中,设置为接收模式
DummyRead=IBDR; //读一下数据寄存器,以便开始下一次接收
RxIndex++; //指向下一个地址。
IIC_RX[RxIndex].index=0; //数据检索复位
}
}
else //当不是地址匹配时发生中断
{
if(IBCR_TX_RX==1) //如果模块是发送模式时
{
if(IBSR_RXAK==0) //表示接受到了应答信息
{
NOP;
}
else //不能够继续传送
{
IBCR_TX_RX =0; //设置为接收模式
DummyRead=IBDR; //读一下数据寄存器,以便开始下一次接收
}
}
else
{
if(IIC_RX[RxIndex].index==0) //如果是第一个数据,则为地址
{
IIC_RX[RxIndex].address=IBDR;
}
if(IIC_RX[RxIndex].index==1) //如果是第一个数据,则为地址
{
IIC_RX[RxIndex].data=IBDR; //如果是第二个数据,则为数据
IIC_RX[RxIndex].token=0xF0; //表示接收到数据,以便以后处理
IIC_RX[RxIndex].index=0;
if(RxIndex==9)
RxIndex=-1;
}
IIC_RX[RxIndex].index++;
}
}
}
}
//处理IIC通信部分
void IIC_Deal(void) {
byte i;
for(i=0;i<10;i++) {
if (IIC_RX[i].token == 0xF0) //收到了完整报文
{
TxPacket[IIC_RX[i].address] =IIC_RX[i].data;
IIC_RX[i].token=0x00; //报文初始化
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -