MSP430硬件I2C使用方法——以BH1710和AT24C

发布者:脑力舞者最新更新时间:2021-02-20 来源: eefocus关键字:MSP430  硬件I2C  BH1710  AT24C 手机看文章 扫描二维码
随时随地手机看文章

硬件的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

关键字:MSP430  硬件I2C  BH1710  AT24C 引用地址:MSP430硬件I2C使用方法——以BH1710和AT24C

上一篇:MSP432安装与环境配置(ccs)
下一篇:利用CCSV5.1自带的430ware的强大资源库学习430

推荐阅读最新更新时间:2024-11-17 04:59

msp430F5438+CC2520通信
软件的实现主要是对硬件的初始化和简单基于IEEE820.15.4格式的无线收发。 硬件初始化包括时钟的初始化,SPI初始化,UART初始化等。 以下是一个时钟初始化的程序: MSP430F5438 // ----------------- // /|\| | // | | P7.0|-- XT1 37.768K // --| P7.1 |-- // | P5.2|-- XT2 16M // | P5.3|-- // | | 硬件连接方面,P7.0与P7.1连接晶振XTI,P
[单片机]
MSP430单片机开发环境搭建攻略
许多初学MSP430单片机的童鞋,在购买开发板之后不知道如何建立工程,编写代码并调试单片机,下面,小编将图文介绍MSP430开发环境搭建。 一、安装IAR IDE 首先安装IAR for MSP430 编译器,可以到IAR官网下载;可以选择试用版本亦或是下载后破解软件; 二、建立工程 打开IAR for MSP430软件,点击Project/Create New Project...在弹出菜单中选择C/main点击确定后,便创建好工程,可在左边工程管理器看到,在main.c中便可以编写代码; 三、设置调试(Debug)参数 在建立工程并编写代码后,在调试之前需要设置基本信息,如下图所示,需要设置
[单片机]
<font color='red'>MSP430</font>单片机开发环境搭建攻略
按键的长按与短按(基于MSP430F5529)
长按与短按的区别只是加上一个适当的延时然后再去判断引脚状态。 定义: #define KEYDIR P2DIR #define KEYIN P2IN #define KEYIFG P2IFG #define KEYIE P2IE #define KEYIES P2IES #define KEYREN P2REN #define S1 BIT0 extern unsigned char key_key; 在中断中处理长按与短按: #pragma vector=PORT2_VECTOR //声明中断向量地址 __interrupt void GPIOIntHandler(void) { unsigned int I
[单片机]
MSP430实现的嵌入式因特网终端设计
本文详细描述了用TI公司的MSP430单片机实现嵌入式因特网终端的设计,包括硬件和软件两大部分。MSP430微控制器控制以太网控制器CS8900A实现本地局域网的功能,通过TCP/IP协议提供与因特网进行连接的应用接口,使用该应用接口,可以建立新的任务或改变现有的任务,实现与因特网中其它终端间的通信。在本文中,给出了硬件原理图,说明了部分模块的工作流程。 1. 介绍 计算机通信系统尤其是因特网在日常生活中的作用越来越重要,并且呈加速发展的趋势。如今,上网不再是个人电脑和网络工作站的专利,很多用微控制器(或称单片机)控制的嵌入式系统也成为了因特网网络节点中的一员,通常,这种嵌入式系统可称为嵌入式因特网终端。试想,如果通过网页浏览
[单片机]
用<font color='red'>MSP430</font>实现的嵌入式因特网终端设计
MSP430的低功耗事件驱动工作模式
MSP430系列单片机的各个模块都可以独立运行,如定时器、输入/输出端口、A/D转换、看门狗、液晶显示器等都可以在CPU休眠的状态下独立工作。若需要主CPU工作,任何一个模块都可以通过中断唤醒CPU,从而使系统以最低功耗运行。 让CPU工作于突发状态可以充分利用CPU的低功耗性能。通常,使用软件将CPU设定到某一低功耗模式,在需要时使用中断将CPU从休眠状态中唤醒,完成工作后又可以进入相应的休眠状态。如:让CPU工作在LPM3状态,通过中断事件转换到AM活动模式,根据运行需要,又可以从AM状态进入相应的低功耗模式:LPM0/LPM3或LPM4。 系统的这些低功耗特性是靠系统对中断的响应来实现的。系统响应中断的过程: (1)
[单片机]
基于MSP430和Cyclone II 的网络数据加密实现
简介:随着信息技术和网络化进程的发展,网络通信安全问题日益突出。现场可编程门阵列(FPGA)以其自身设计灵活、可靠性高的优点广泛应用于加密领域。硬件实现的加密算法不占用计算机资源.加密过程完全与外部总线隔离,具有较高的数据保护能力。算法可灵活改变,具有较强的独立性。加密机由单片机,FPGA和El通信接口组成。FPGA内部算法由VHDL语言编写。 2 流加密解密原理及算法 2.1 流加密解密原理 流密码由密钥和密码算法两部分组成,密钥一般存储在加解密设备内部,在数据传输前已设置完成。密码算法在较长时间内是不变的。在同步流密码中,只要发送端和接收端有相同的密钥和内部状态,就能产生相同的密钥流。 数据传输时,加密端和解密端
[单片机]
基于<font color='red'>MSP430</font>和Cyclone II 的网络数据加密实现
使用 MSP430 内部时钟生成随机数字
不管是生成随机器件地址、强化加密算法还是创建独立产品密钥,可靠地生成随机数字都变得日益重要。这些随机数字对于日常嵌入式系统特别有用,比如车库门接收机必须一一对应地正确识别远程控制的随机数字,以防止非授权访问。为了生成随机数字,开发人员可以使用高级 16 位MCU确保将所有信号都控制在 MCU 内部,而且与昂贵的模拟硬件相比,这种解决方案成本更低、安全性也更高。 双时钟芯片架构可以支持 TI 超低功耗MCU MSP430 的随机数字生成能力。超低频振荡器 (VLO) 与数控振荡器 (DCO) 是两个独立的时钟系统,可以利用二者间的计时差生成随机位流。一个 VLO 时钟周期中的DCO 时钟数量大致相同。然而,由于 VLO 与 DC
[单片机]
使用 <font color='red'>MSP430</font> 内部时钟生成随机数字
基于Modbus协议的三相电力智能配电系统设计
  随着电力自动化技术的发展和电力智能配电系统建设的需要,具有数字化、智能化、网络化、多功能的配电系统日渐成为中低压配电的最基本要求,采用专用的三相电参量采集芯片和高性价比的16位MSP430处理器构建的智能配电系统,并通过RS 485总线实现电力系统通用的Modbus协议,具有适时遥测数据精度高、遥控可靠、遥信号时、低功耗、扩展性好等优点。    1 三相电力配电系统的硬件设计   1.1 TI MSP430F149处理器   TI MSP430F149是一款超低功耗的高性价比精简指令集16位单片机,最小指令周期125 ns,32 kB的FLASH和2 kB RAM,具有丰富的片上外设资源和5个双向8位IO口,并具有
[电源管理]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved