当前位置:首页 > 单片机 > 单片机
[导读]0.前言对于大多数单片机来说,I2C成了一个老大难问题。从51时代开始,软件模拟I2C成了主流,甚至到ARMCortex M3大行其道的今天,软件模拟I2C依然是使用最广的方法。虽然软件模拟可以解决所有的问题,但是总感觉没有充

0.前言

对于大多数单片机来说,I2C成了一个老大难问题。从51时代开始,软件模拟I2C成了主流,甚至到ARMCortex M3大行其道的今天,软件模拟I2C依然是使用最广的方法。虽然软件模拟可以解决所有的问题,但是总感觉没有充分发挥MCU内部的硬件资源。查阅了所有关于MSP430F5系列的图书,没有关于硬件I2C的应用代码,自己通过调试摸索,把经验总结之后和大家分享,希望大家喜欢。同时,I2C的使用可以分为等待法和中断法,从理解的角度来说等待法思路清晰易于上手,从功耗的角度出发,中断法可以灵活的进入低功耗模式,但是不易理解。本文先从等待法入手。

MSP430F5系列的硬件I2C使用大致会有以下问题:

【I2C地址设定】一般情况下I2C的7位地址被写成了8位长度,最低位无效。例如AT24C02的I2C地址为0xA0,其实真正的7位地址为0x50。而MSP430正是需要填入这7位地址0x50。

【I2C停止位发送】在I2C读操作过程中,读取最后一个字节之后MCU应向从机发送无应答,MSP430F5系列的MCU发送无应答的操作将自动完成,这就以为在读取最后一个字节内容时,应先操作停止位相关寄存器。

【I2C起始位发送】如果仔细分析MSP430F5参考手册,将会发现读操作和写操作发送I2C起始位时略有不同。写操作时需要先向TXBUF中写入数据,之后才可以等待TXSTT标志位变为0,而读操作和写操作稍有不同。

【AT24C02操作时序图】



1.初始化设置1.1代码实现


voiducb0_config(void)

{

P3SEL&=~BIT2;//P3.2@UCB0SCL

P3DIR|=BIT2;

P3OUT|=BIT2;

//输出9个时钟以恢复I2C总线状态

for(uint8_ti=0;i<9;i++)

{

P3OUT|=BIT2;

__delay_cycles(8000);

P3OUT&=~BIT2;

__delay_cycles(8000);

}

P3SEL|=(BIT1+BIT2);//P3.1@UCB0SDAP3.2@UCB0SCL

//P3.1@ISP.1P3.2@ISP.5

UCB0CTL1|=UCSWRST;

UCB0CTL0=UCMST+UCMODE_3+UCSYNC;//I2C主机模式

UCB0CTL1|=UCSSEL_2;//选择SMCLK

UCB0BR0=40;

UCB0BR1=0;

UCB0CTL0&=~UCSLA10;//7位地址模式

UCB0I2CSA=EEPROM_ADDRESS;//EEPROM地址

UCB0CTL1&=~UCSWRST;

}


1.2代码分析

I2C从设备的地址一般有以下通俗说法——7位地址,写地址(写控制字)和读地址(读控制字)。1个I2C通信的控制字节(I2C启动之后传送的第一个字节)由7位I2C地址和1位读写标志位组成,7位I2C地址即7位地址,若读写标志位为读标志(读写标志位置位)加上7位I2C地址便组成了读地址(读控制字),若读写标志位为写标志(读写标志位清零)加上7位地址便组成了写地址(写控制字)。例如AT24C02的I2C7位地址为0x50,读地址(读控制字)为0xA1,写地址(写控制字)为0xA1。

在MSP430F5系列中,I2CSA地址寄存器应写入7位地址,参照上面的例子应写入0X50。至于I2C读写位的控制由CTL1寄存器完成,用户无需干预。

在I2C设置开始之前,可以先通过SCL端口发送9个时钟信号,该时钟信号可以是I2C从机芯片从一种错误的通信状态恢复,虽然这9个时钟信号不起眼但是对于调试过程来说非常有用。例如在调试过程中,错误的发送了停止位,若再次启动调试则I2C从设备仍处于一种错误的状态,这9个时钟信号可以把I2C从设备从错误的状态“拉”回来。


2.写单个字节

向I2C从设备写入单个字节应该是最为简单的一个操作,因为所有的控制权都在主机手中。写单个字节实际包括了2个重要部分,一个便是写寄存器地址,另一个便是写寄存器内容。对于AT24C02而言,存储内容的字节长度为一个字节,而对于容量更大的EEPROM而言,存储地址可为两个字节。


2.1 代码实现


uint8_teeprom_writebyte(uint8_tword_addr,uint8_tword_value)

{

while(UCB0CTL1&UCTXSTP);

UCB0CTL1|=UCTR;//写模式

UCB0CTL1|=UCTXSTT;//发送启动位

UCB0TXBUF=word_addr;//发送字节地址

//等待UCTXIFG=1与UCTXSTT=0同时变化等待一个标志位即可

while(!(UCB0IFG&UCTXIFG))

{

if(UCB0IFG&UCNACKIFG)//若无应答UCNACKIFG=1

{

return1;

}

}

UCB0TXBUF=word_value;//发送字节内容

while(!(UCB0IFG&UCTXIFG));//等待UCTXIFG=1

UCB0CTL1|=UCTXSTP;

while(UCB0CTL1&UCTXSTP);//等待发送完成

return0;

}



2.2 代码分析

关于代码出口的说明,关于I2C的读写函数,若返回值为0说明所有的操作正常,若返回值为非0说明操作有误,例如1代表从机无应答。这种组合方式可能与各位的编程习惯有出入,一般认为返回1表示操作成功,而返回0表示操作失败。这种方式的问题便是无法有效的表达错误原因,因为“0”只有一个,而非“0”却有很多。

写单个字节可以划分为——从机写地址发送、寄存器地址发送、寄存器内容发送。寄存器地址的发送由MSP430自动完成,这和软件模拟的操作有所区别。请勿发送I2C从机地址,若操作AT24C02发送需要写入的存储字节的首地址即可。

在单字节和多字节写操作过程中,尤其要注意UCTXSTT标志位的变化位置。UCTXSTT标志位会在从机接收完写控制字节或读控制字节之后变化,但是在写控制字节发送之后,必须先填充TXBUF,再尝试等待STT标志位复位,此时STT标志位和TXIFG标志位会同时变化。若从机没有应答,那么NACK标志位也会发生变化。再次强调需要先填充TXBUF,在等待STT标志位复位。以下代码将导致程序一直停留在while(UCB0IFG & UCTXSTT)处,具体的原因可查看MSP430参考手册。


[cpp]view plaincopy

while(UCB0CTL1&UCTXSTP);

UCB0CTL1|=UCTR;//写模式

UCB0CTL1|=UCTXSTT;//发送启动位

//等待UCTXSTT=0同时变化,但是很遗憾该变化不会发送

while(UCB0IFG&UCTXSTT);

UCB0TXBUF=word_addr;//发送字节地址



3.写多个字节3.1代码实现


uint8_teeprom_writepage(uint8_tword_addr,uint8_t*pword_buf,uint8_tlen)

{

while(UCB0CTL1&UCTXSTP);

UCB0CTL1|=UCTR;//写模式

UCB0CTL1|=UCTXSTT;//发送启动位

UCB0TXBUF=word_addr;//发送字节地址

//等待UCTXIFG=1与UCTXSTT=0同时变化等待一个标志位即可

while(!(UCB0IFG&UCTXIFG))

{

if(UCB0IFG&UCNACKIFG)//若无应答UCNACKIFG=1

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

    本文主要介绍的就是基于DM642的视频采集处理系统中I2C模块的正确初始化,以及通过I2C总线正确地对视频解码芯片SAA7115的寄存器读/写程序。   1 I

关键字: dm642 i2c 视频采集

    串行总线和并行总线相比具有结构简单、占用引脚少、成本低的优点。常见的串行总线有USB、IEEE1394、I2C等,其中I2C总线具有使用简单的特点,在单片机、串行E2P

关键字: vhdl i2c 串行总线

  I2C简介   I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息。主器件用于启动总线传送数据,并产生时钟以开

关键字: Arduino i2c

本项目开发了一个使用 Xilinx 公司的 SPARTAN3A-DSP FPGA 作为目标开发板,采集数字和模拟传感器数据,并将传感器数据采用 I2C 接口与上级无线传感器网络进行通信的环境监测

关键字: i2c 无线传感器网络 环境监测

2020年6月17日-国内领先的信号链芯片及其解决方案提供商苏州纳芯微电子股份有限公司(以下简称“纳芯微”)日前宣布推出五款I2C总线接口类芯片产品。

关键字: i2c 纳芯微 接口产品

0 引 言   当前汽车音响与高保真的立体声音响系统中都包含了微处理器电路单元,这为实现音频处理提供了控制接口,可以通过控制接口实现许多需要的功能控制。作为音响系统主体的音频处理电路性能直接决定了整

关键字: i2c 总线 音频处理电路

红、绿、蓝(RGB)LED可用于建筑和舞台照明系统,用以形成明亮的投影色彩——有时会在RGB组合中添加白色LED,从色调、饱和度和亮度方面扩展色彩范围(图1)。无论色彩分量有多少,都必须精确控制

关键字: i2c LED

随着科学技术的发展,LED技术也在不断发展,为我们的生活带来各种便利,为我们提供各种各样生活信息,造福着我们人类。亚德诺半导体公司(AnalogDevices,Inc.,简称ADI)宣布推出PowerbyLinear&#...

关键字: i2c led驱动器 电源技术解析 powerbylinear

我们都知道I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息。

关键字: i2c spi uart 总线与接口
关闭
关闭