今晚我们来学习I2C的编程,呵呵,还是老规矩,最简单的非中断回环测试。
先来总体看下寄存器结构
其实对于我们今晚的主题来讲,主要用到了I2COAR、I2CSTR、I2CCLKL、I2CCLKH、I2CDRR、I2CDXR、I2CMDR、I2CPSC这几个寄存器,详细的寄存器介绍大家自己下去看,我们就不浪费时间说这个了。
然后我们来理一下操作步骤:
1、使能外设I2C时钟(这步非常重要,也很容易忽略);
2、在复位状态下,设置I2C时钟PSC、I2CCLKL、I2CCLKH,还要设置地址信息和回环模式;
3、使能I2C;
4、设置I2C相关引脚;
5、编写发送和接收函数,在这里需要注意的是,TRX这位的值,当为0时,是接收模式;为1时,是发送模式;
好了,思路大概就这样,刚刚去写程序测试了一把,是OK的,我直接贴程序了
首先是I2C的初始化函数
void InitI2C()
{
EALLOW;
SysCtrlRegs.PCLKCR0.bit.I2CAENCLK = 1;
I2caRegs.I2COAR=0x003f; //7-bit addressing
I2caRegs.I2CMDR.bit.IRS = 0;
I2caRegs.I2CMDR.bit.DLB=1;
I2caRegs.I2CPSC.all = 5; // 7M <= 60M/(PSC+1) <=12M
I2caRegs.I2CCLKL = 15;
I2caRegs.I2CCLKH = 15;
I2caRegs.I2CMDR.bit.IRS = 1;
EDIS;
}
然后是GPIO引脚设置
void InitI2CGpio()
{
EALLOW;
/* Enable internal pull-up for the selected pins */
// Pull-ups can be enabled