MSP430硬件I2C使用方法(转)

2019-07-31 15:18发布

MSP430硬件I2C使用方法——以BH1710和AT24C02为例
硬件的I2C控制器终于调出来了,这些天一直在钻死胡同,其实最好的参考资料还是TI官方提供的。代码参考了MSP430User’s GuideApplication Note,下面提供IAR工程并做简要解释:
采用的芯片:MSP430F1611USART0 Master方式)
设备地址:BH1710(写地址0x46,读地址0x47),AT24C02(写地址0xA0,读地址0xA1
工程文件:(采取模块化方法,只需添加I2C文件并修改相应的器件模块即可)

懒兔子I2C范例.rar
接口电路:


一般情况下,大家在调试I2C设备时会首先考虑采用IO口模拟I2C总线的方法,这样的方法思路简单,只需要给出正确的时序即可。但是这样也有意想不到的问题,比如时序的严格性:同样的时序,在BH1710上就能跑通而AT24C02上就时好时坏,读数据正确而写数据有问题,且十有**都无法写入。也就是说,不同器件对于时序的要求是有差别的,这样即使编写了通用的模拟程序,也会偶尔出些莫名其妙的问题。
于是我开始鼓捣硬件的I2CMSP430x15xMSP430x16x系列的USART带有I2C模式,结构如下:
可以看出,I2C可以通过I2CSSELx位选择时钟输入方式,在完成初始化设置后,通过I2CDRWByte方式下用I2CDRB表示)来读写数据,下面是一个I2C初始化过程:
初始化过程的大致顺序为将USART设置为I2C模式,配置I2C工作方式、地址、时钟源和分频,启动I2C控制器。这里需要注意的是,I2CSA中填入的是7位地址,即如果设备的写入地址为0xA0,需要令I2CSA = (0xA0 >> 1),即0x50
SCL的频率则由I2CPSCI2CSCLHI2CSCLL共同决定。I2CPSC为预分频,I2CPSC=0时为一分频,I2CPSC=1时为二分频,最高只支持4分频。I2CSCLHI2CSCLL分别表示SCL高电平和低电平的持续时间,实际时间TH= (I2CPSC +1) x (I2CSCLH + 2),需要什么频率可以自己算,同时也可以为函数增加一个freq参数,在初始化的时候设置频率。请注意根据手册上的说明,I2CIN输入的时钟源频率至少要等于10*SCL* I2CPSC分频数,至于不这么干会怎样,大家可以试试呀。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
6条回答
金鱼木鱼
2019-07-31 18:42
void I2C_Init(unsigned char slaveAddress)
{

I2C_PORT_SEL |= SDA_PIN + SCL_PIN;
//
设置引脚,用作USART接口

I2C_PORT_DIR &= ~(SDA_PIN + SCL_PIN);




U0CTL |= I2C+SYNC;
//USART0
配置为I2C模式

U0CTL &= ~I2CEN;
//
配置I2C前先关闭I2C控制器


//
这里采用默认配置,7位地址,无DMA,无反馈

I2CTCTL = I2CTRX+I2CSSEL_2;
//byte
模式,repeat模式,I2C时钟源为SMCLK

I2CSA = slaveAddress;
//
设置从设备地址



I2COA = 0xAA;
//
本机地址,这个目前用不到




I2CPSC = 0x01;
//I2C
时钟 = SMCLK/2 = 2MHz

I2CSCLH = 0x18;
//SCL
高电平周期 = 20*I2C clock

I2CSCLL = 0x18;
//SCL
低电平周期
= 20*I2C clock


//I2C_SCL
频率 = 2MHz/20 =100KHz

U0CTL |= I2CEN;
//
开启I2C控制器



if (I2CDCTL&I2CBUSY)
//
检查I2C模块是否空闲,这里应该是检测时钟正确性吧?

{


I2C_PORT_SEL &= ~SCL_PIN;
//
SCL设置为IO输出模式并手动置0

I2C_PORT_OUT &= ~SCL_PIN;


I2C_PORT_DIR |= SCL_PIN;


I2C_PORT_SEL |= SDA_PIN + SCL_PIN;
//
重新设置引脚为I2C模式

};

}


发送数据以BH1710写入指令函数为例,向I2C从设备写入1字节数据,格式及代码如下:
StartSlaveAddressWACKDataACKStop

一周热门 更多>