硬件了解后,打开范例程序的init.c文件,可以看到I2C的程序代码,I2C的位置为0x00且为Slave,用来控制MCP23008!(注意此处须看到更下面文章了解)
dsPIC33EPXXGS50X FAMILY: http://ww1.microchip.com/downloads/en/DeviceDoc/70005127d.pdf
*IIC部分在章节17
透过缓存器设置来完成功能:
init.c文件
结果发生问题 !! 实际使用上发现,程序上的地址,跟波型上并不相符合,相当奇怪。
明明设定地址为0X00但是出然居然是0x20,有鬼阿!
不过工程人员就要用科学的方法解决问题,先不逃跑了,坐下来好好看文件。
东翻西找发现真正的位置设置是在load_config.h , 原来搞错位置了!!
接下来继续进度,因为不会用到仿真负载,所以将I2C的Address改为0xB0,透过void InitI2C(void) 子程序中的协议来传输数据。
测试输出’A’字符
附上IIC部分的程序代码
void InitI2C(void)
{
I2C1CON1bits.I2CEN = 1; // 开启 I2C 功能
//Configure I2C as MASTER to communicate with Load IC
I2C1CON1bits.A10M = 0; // 7位的从端数据与地址
I2C1CON1bits.DISSLW = 1; // Slew rate control disabled
I2C1BRG = I2CBAUDRATE; // IIC传输速率100kHz
IFS1bits.MI2C1IF = 0;
IEC1bits.MI2C1IE = 1; // 开启主端的 I2C 中断
IPC4bits.MI2C1IP = 5;
// 接下来的程序代码用于设定MCP23008(仿真负载)
I2CRegAddr = IOCON_REGADDR;
I2CLoadWrite = 0x20; // 禁用顺序操作
I2C1CON1bits.SEN = 1; // SEN启动条件致能位(当作为I2C主端件运行时)若是=1在SDAx和SCLx引脚上触发; 硬件在结束时清除序列
while(messageComplete == 0);
messageComplete = 0;
I2CRegAddr = IODIR_REGADDR;
I2CLoadWrite = 0x00; // 设置所有IO为输出
I2C1CON1bits.SEN = 1;
while(messageComplete == 0);
messageComplete = 0;
I2CRegAddr = GPIO_REGADDR;
//I2CLoadWrite = (I2CBUCKLOAD1WRITE | I2CBOOSTLOAD1WRITE);
I2CLoadWrite =('A'); //测试输出’A’字符
// I2CLoadWrite = 0xff; //测试用 让GPA口输出高电平
I2C1CON1bits.SEN = 1;
while(messageComplete == 0);
messageComplete = 0;
}
另一端控制器可以收到透过IIC传输的’A’,不过因为数据传输只有7bits,还要继续研究如何传输字符串,以及透过IIC双向通讯。