I2C串口通信应该说和UART在某些地方是相通的,比如数据接收寄存器,接收移位寄存器,数据发送寄存器,发送移位寄存器等的使用,所以同样可以利用寄存器的映射地址来对寄存器进行读写等相关操作,但是数据手册中怎么找不到I2C模块各寄存器的映射地址?另外,发现 I2C模块有关中断的使用和其他类型的中断也有些区别,比如
/*设置I2C中断服务程序结构,该结构中的成员都是中断服务程序的入口地址*/
I2C_IsrAddr addr = {
myALIsr, //中断函数的函数名作为入口地址
myNACKIsr,
myARDYIsr,
myRRDYIsr,
myXRDYIsr
};
而在.c 源文件中,关于这几个函数是这样写的
#include <stdio.h>
/*#pragma 设定编译器的状态或指定编译器完成一次特定的动作*/
#pragma CODE_SECTION (myALIsr,"myisrSeg");
#pragma CODE_SECTION (myNACKIsr,"myisrSeg");
#pragma CODE_SECTION (myARDYIsr,"myisrSeg");
#pragma CODE_SECTION (myRRDYIsr,"myisrSeg");
/*I2C模块的5种类型中断*/
void myALIsr()
{
printf("I2C Arbitration Interrupt Occurred\n"); //仲裁丧失中断
asm("\tNOP ;====> I2C periodic interrupt routine");
}
void myNACKIsr()
{
printf("I2C NACK Interrupt Occurred\n"); // 无应答中断
asm("\tNOP ;====> I2C periodic interrupt routine");
}
void myARDYIsr()
{
printf("I2C ARDY Interrupt Occurred\n");// 接收数据就绪中断
asm("\tNOP ;====> I2C periodic interrupt routine");
}
void myRRDYIsr()
{
printf("I2C RRDY Interrupt Occurred\n");//寄存器访问就绪中断
asm("\tNOP ;====> I2C periodic interrupt routine");
}
void myXRDYIsr()
{
printf("I2C XRDY Interrupt Occurred\n");//发送数据就绪中断
asm("\tNOP ;====> I2C periodic interrupt routine");
}
疑惑的是:这里的函数是否是中断函数?如果是中断函数的话,为什么没有关键字 interupt,或者说和 有 interput的中断函数有无区别? 一个模块中中断发生,可不可以没有中断服务子程序?
最后 程序中用到了 #pragma CODE_SECTION (myALIsr,"myisrSeg"); 不太明白具体的含义?想知道具体的作用是什么? |