软件iic网上代码很多,也便于移植,但硬件iic相关教程就很少了,受限于硬件型号,没有找到可直接使用的代码例程。
我研究了好几天终于入门,讲讲我的一些经验。
这是两篇收益匪浅的文章:
MSP430 G2553 硬件IIC OLED 单片机 OLED滚动显示_ucb0txifg-CSDN博客
踩过的一些坑:
1. IIC的地址为7位,总长为8位,最低位为读写控制位。硬件IIC与软件IIC写入的从机地址不一样。IIC初始化时需填入的地址是长度为7位的地址。
2. msp430单片机内部有USCI_A和USCI_B两种USCI模块,其中只有USCI_B可以配置成I2C模式。
3. 这里把USCI_B硬件模块配置成了IIC,所以连线是连USCI_B模块,而非芯片原理图上的I2C接线。
4. 默认状态下,开发板USCI_B模块的一个引脚(P1.6)通过一个跳帽与某引脚相连,具体功能不明,但导致I2C通信异常。需去掉该跳帽。
数据发送流程如下:
1、 写入从机地址
2、 配置为发送模式
3、 产生起始信号
4、 判断发送缓冲寄存器是否为空:while((IFG2 & UCB0TXIFG) != UCB0TXIFG);
5、 为空则将写的地址写入发送缓冲寄存器
6、 判断从机应答信号,有应答信号了
7、 则判断发送缓冲寄存器是否为空,是为空了
8、 则发送数据
9、 若有多个数据则循环到第七步,若只发送一个数据,则产生停止信号
部分关键代码,重写OLED(SSD1306)所需的Write_IIC_Command、Write_IIC_Data、OLED_WR_Byte函数。
void Write_IIC_Command(unsigned char IIC_Command)
{
while( UCB0CTL1& UCTXSTP );
UCB0CTL1 |= UCTR; // 写模式
UCB0CTL1 |= UCTXSTT; // 发送启动位
// 等待UCTXIFG=1与UCTXSTT=0 同时变化等待一个标志位即可
while((IFG2 & UCB0TXIFG)==0);
UCB0TXBUF = 0x00; // 发送字节内容
while((IFG2 & UCB0TXIFG)==0); // 等待UCTXIFG=1
UCB0TXBUF = IIC_Command; // 发送字节内容
while((IFG2 & UCB0TXIFG)==0); // 等待UCTXIFG=1
UCB0CTL1 |= UCTXSTP;
while(UCB0CTL1& UCTXSTP); // 等待发送完成
return 0;
}
void Write_IIC_Data(unsigned char IIC_Data)
{
while( UCB0CTL1& UCTXSTP );
UCB0CTL1 |= UCTR; // 写模式
UCB0CTL1 |= UCTXSTT; // 发送启动位
// 等待UCTXIFG=1与UCTXSTT=0 同时变化等待一个标志位即可
while((IFG2 & UCB0TXIFG)==0);
UCB0TXBUF = 0x40; // 发送字节内容
while((IFG2 & UCB0TXIFG)==0); // 等待UCTXIFG=1
UCB0TXBUF = IIC_Data; // 发送字节内容
while((IFG2 & UCB0TXIFG)==0); // 等待UCTXIFG=1
UCB0CTL1 |= UCTXSTP;
while(UCB0CTL1& UCTXSTP); // 等待发送完成
return 0;
}
void OLED_WR_Byte(unsigned dat,unsigned cmd)
{
if(cmd) Write_IIC_Data(dat);
else Write_IIC_Command(dat);
}
错漏之处还请指出,一同进步。