历史上的今天
返回首页

历史上的今天

今天是:2025年02月20日(星期四)

正在发生

2021年02月20日 | MSP430硬件I2C使用方法——以BH1710和AT24C

2021-02-20 来源:eefocus

硬件的I2C控制器终于调出来了,这些天一直在钻死胡同,其实最好的参考资料还是TI官方提供的。代码参考了MSP430的User’s Guide和Application Note,下面提供IAR工程并做简要解释:

采用的芯片:MSP430F1611(USART0 Master方式)

设备地址:BH1710(写地址0x46,读地址0x47),AT24C02(写地址0xA0,读地址0xA1)

工程文件:(采取模块化方法,只需添加I2C文件并修改相应的器件模块即可)


接口电路:

一般情况下,大家在调试I2C设备时会首先考虑采用IO口模拟I2C总线的方法,这样的方法思路简单,只需要给出正确的时序即可。但是这样也有意想不到的问题,比如时序的严格性:同样的时序,在BH1710上就能跑通而AT24C02上就时好时坏,读数据正确而写数据有问题,且十有八九都无法写入。也就是说,不同器件对于时序的要求是有差别的,这样即使编写了通用的模拟程序,也会偶尔出些莫名其妙的问题。


于是我开始鼓捣硬件的I2C,MSP430x15x、MSP430x16x系列的USART带有I2C模式,结构如下:

可以看出,I2C可以通过I2CSSELx位选择时钟输入方式,在完成初始化设置后,通过I2CDRW(Byte方式下用I2CDRB表示)来读写数据,下面是一个I2C初始化过程:

初始化过程的大致顺序为将USART设置为I2C模式,配置I2C工作方式、地址、时钟源和分频,启动I2C控制器。这里需要注意的是,I2CSA中填入的是7位地址,即如果设备的写入地址为0xA0,需要令I2CSA = (0xA0 >> 1),即0x50。


SCL的频率则由I2CPSC、I2CSCLH、I2CSCLL共同决定。I2CPSC为预分频,I2CPSC=0时为一分频,I2CPSC=1时为二分频,最高只支持4分频。I2CSCLH和I2CSCLL分别表示SCL高电平和低电平的持续时间,实际时间TH= (I2CPSC +1) x (I2CSCLH + 2),需要什么频率可以自己算,同时也可以为函数增加一个freq参数,在初始化的时候设置频率。请注意根据手册上的说明,I2CIN输入的时钟源频率至少要等于10*SCL* I2CPSC分频数,至于不这么干会怎样,大家可以试试呀。


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字节数据,格式及代码如下:


Start

SlaveAddress

W

ACK

Data

ACK

Stop


void BH_WriteCmd(unsigned char Cmd)

{

while (I2CDCTL&I2CBUSY);




I2CBufferArray[0] = Cmd;

PtrTransmit = 0;




I2C_WriteMod();

I2CNDAT = 1;


I2CTCTL |= I2CSTT;


__bis_SR_register(LPM0_bits + GIE);

I2CTCTL |= I2CSTP;

while(I2CTCTL & I2CSTP);

}


其中I2CNDAT用于指定发送数据的字节数,I2CSTT位设定开始发送, I2CSTP位设定发送结束。在这里,发送函数只是将数据填入缓存中,实际的发送过程在__interrupt void ISR_I2C(void) 中断函数中完成,而在等待发送中断的过程中,系统进入LPM0休眠,整个过程为阻塞式。


读取函数与发送函数类似,依然已BH1710为例:

unsigned int BH_Resualt(void)

{

unsigned char byteHight,byteLow;

while (I2CDCTL&I2CBUSY); //等待I2C模块空闲


I2C_ReadMod();

I2CNDAT = 2; //读取2字节

I2CTCTL |= I2CSTT; //发送Start开始接收


__bis_SR_register(LPM0_bits + GIE); //进入休眠等待

byteHight = I2CBuffer;//高位数据

__bis_SR_register(LPM0_bits + GIE);

byteLow = I2CBuffer; //低位数据


I2CTCTL |= I2CSTP; //发送Stop结束接收

while(I2CTCTL & I2CSTP); //等待Stop发送完毕



return ((((unsigned int)byteHight)<<8)+byteLow);//合成数据

}


需要注意的是,BH1710一次返回两个字节数据,需令I2CNDAT = 2,同时在读完一次缓存后再读取下一个。


对于AT24C02,读取方式有任意地址和当前地址读取的差别,可以参见工程代码。


最后是中断函数:

#pragma vector=USART0TX_VECTOR

__interrupt void ISR_I2C(void)

{

switch (__even_in_range(I2CIV, I2CIV_STT))

{

case I2CIV_RXRDY: //接收就绪 (RXRDYIFG)

I2CBuffer = I2CDRB; //读取数据,跳出休眠

__bic_SR_register_on_exit(LPM0_bits);

break;

case I2CIV_TXRDY: //发送就绪 (TXRDYIFG)

while(!(I2CDCTL & I2CTXUDF)); //等待上一个数据发送完毕

I2CDRB = I2CBufferArray[PtrTransmit]; //发送Buff中的数据

PtrTransmit--;

if (PtrTransmit < 0) //PtrTransmit为发送数据个数的自减计数器,减完表示发送结束

{

I2CIE &= ~TXRDYIE; //最后清标志位

I2CIFG &= ~TXRDYIFG;

__bic_SR_register_on_exit(LPM0_bits);

}

break;

}

}


I2C的中断变量就是串口发送中断USART0TX_VECTOR,这里只用到了RXRDY 和TXRDY,其他的中断标志位判断已包含在工程文件里,需要时可添加相应代码。这里的接收缓存I2CBuffer只能存储一个字节数据,接收多个字节时需要多次接收,有大量数据接收需要的童鞋可以改成数组的形式,操作方法同I2CBufferArray[]。


参考:Interfacing an EEPROM via I2C Using the MSP430

MSP430x1xx User's Guide

推荐阅读

史海拾趣

GMT(致新科技)公司的发展小趣事
在设置界面中,找到“定时开机”或类似的选项,并选中它。
Capax Technologies Inc公司的发展小趣事

随着国内市场的饱和,Capax Technologies Inc开始积极拓展海外市场。公司制定了详细的国际化战略,通过设立海外研发中心、建立销售网络等方式,逐步进入国际市场。在国际化的过程中,Capax Technologies Inc不仅提升了自身的技术水平和市场竞争力,还积累了丰富的国际经验,为公司的长远发展奠定了坚实基础。

Fillfactory Nv公司的发展小趣事

FIDELIX公司成立于1990年,是一家专注于存储芯片研发与销售的韩国企业。在公司成立初期,FIDELIX凭借对技术的深入研究和对市场的敏锐洞察,成功推出了多款性能优越的NAND FLASH(闪存)和SDR/DDR(单/双数率同步动态存储器)等存储芯片产品。这些产品不仅在韩国市场上获得了良好的口碑,同时也开始逐步进入国际市场。

随着技术的不断进步和市场的不断扩大,FIDELIX逐渐在韩国存储芯片领域崭露头角。公司不断投入研发资金,加强技术创新,努力提升产品的性能和品质。同时,FIDELIX也积极拓展销售渠道,与多家国内外知名厂商建立了合作关系,为公司的持续发展奠定了坚实的基础。

Brite-Led Optoelectronics Inc公司的发展小趣事

Brite-Led Optoelectronics Inc公司自创立之初,便专注于LED技术的研发与应用。在一次关键的技术突破中,公司成功开发出一种高效、稳定的LED芯片,其亮度与寿命均远超当时市场上的同类产品。这一技术突破迅速为Brite-Led赢得了市场认可,奠定了其在LED行业的领先地位。随着该技术的不断迭代和完善,Brite-Led的产品逐渐广泛应用于照明、显示、背光等多个领域。

BLACK&DECKER公司的发展小趣事

BLACK&DECKER一直致力于产品革新和专利申请。1914年,公司为世界第一台配有枪式手柄、扳机开关和通用马达的便携式手电钻申请了专利。这一发明极大地提高了工作效率,并在市场上取得了巨大的成功。此后,BLACK&DECKER不断推出创新产品,如1946年发明的世界上第一台专为家用消费者设计的便携式电钻,以及后续的电动篱笆剪、全绝缘电钻等一系列重要发明。

Fronter Electronics Co Ltd公司的发展小趣事

进入21世纪后,Fronter电子意识到技术创新的重要性,开始加大在技术研发方面的投入。公司成立了专门的研发团队,致力于IC模块、晶振、滤波器、电感等电子产品的技术开发与升级。同时,Fronter电子积极申请专利,保护自主知识产权,并逐步打造出了自己的品牌“FT”。随着技术实力的增强和品牌知名度的提升,Fronter电子在电子行业中的影响力进一步扩大。

问答坊 | AI 解惑

电子制作的基本知识【图】

平时整理的一些电子基本常识,主要供生产线和维修组培训用,高手就不用下了…

查看全部问答>

电路分析基础

本帖最后由 paulhyde 于 2014-9-15 09:16 编辑 电路分析基础----学习中,有些落后!  …

查看全部问答>

单片机串口通讯

一个单片机发送,另外一个接收。 现在遇到一个问题,发送的单片机,在每发送一个字符串之后,都要延时400us左右,才能继续发送下一个字符串。 如果不延时,或者延时少于400us,接收的数据就是乱码。 这大概是什么原因?是波特率太低?还是因为接 ...…

查看全部问答>

xp系统与Wmware中虚拟操作系统linux ,如何让 linux上网

说明:我真实主机的网络配置:              IP Address  ( 192.168.16.95 )              网关是          (192.168. ...…

查看全部问答>

ARMQQ交流群65564961

ARMQQ交流群65564961…

查看全部问答>

!!!所有工程师们新年快乐!!

                                 !!!所有工程师们新年快乐!!…

查看全部问答>

【MSP430共享】嵌入式操作系统μC/OS—Ⅱ在MSP430F168单片机上的移植

本文给出了在 R A N空间较少的单片机上移植嵌入式操作系统 I ~ C / O S—I I 的一种方法. 并根据该方法成功将 I ~ C / O S—I I 移植到了只有2 K   R A N空间的NS P 4 3 0 F I 6 8单片机上。  [ 本帖最后由 鑫海宝贝 于 2011-10- ...…

查看全部问答>

动手自制51和avr的下载器

详尽资料,需要的自己下载…

查看全部问答>

免费赠送DIY数控电源PCB板,请帮忙验证XDS100V2电路图!

1、送的板子:   https://bbs.eeworld.com.cn/thread-329991-1-1.html     2、数量:共1片   3、赠送目标:有意DIY 仿真器XDS100V2者   4、赠送要求:验证PCB上的JTAG部分的电路及PCB连接的正确性,找出板上的 ...…

查看全部问答>

什么是VFD(真空荧光显示屏)

一、什么是 VFD 真空荧光显示屏(VACUUM FLUORESCENT DISPLAY)是从真空电子管发展而来的显示器件,由发射电子的 阴极(直热式,统称灯丝)、加速控制电子流的栅极、玻璃基板上印上电极和荧光粉的阳极及栅网和玻盖构 成。它利用电子撞击荧光粉, ...…

查看全部问答>