一、USCI I2C 驱动介绍

对于MSP430G2553,硬件I2C由外设USCI(Universal Serial Communication Interface)提供。USCI又分为USCI_A和USCI_B,其中USCI_A支持UART/IrDA/LIN/SPI通讯,USCI_B支持I2C/SPI通讯。MSP430G2553带有一个USCI_A和一个USCI_B,硬件I2C对应的管脚为P1.6(UCB0SCL)和P1.7(UCB0SDA)。

由于Launchpad上P1.6连接到了LED2,因此在使用硬件I2C时,务必要将LED2对应的跳线取下,否则总线无法正常工作

在官方MSP430x2xx Family User's Guide中,已对USCI_B的I2C模式进行的详细的介绍。了解这些信息,由于排查I2C通讯中可能遇到的问题。然而,本着不重复发明轮子的想法,TI已经提供了详细的I2C驱动代码和使用范例,正常开发只要增加TI的代码文件并稍作更改,直接调用TI提供的函数即可。

几个可参考的官方USCI I2C驱动资料/范例有:

Application Report, Using the USCI I2C Master, SLAA382A

—— 重点推荐。

Application Report, Using the USCI I2C Slave, SLAA383

—— 重点推荐。

Application Report, I2C Communication Sample Code for the bq76940 with a CRC Option Based on the MSP430G2553, SLVA626B

—— 包含了CRC的计算方法,驱动代码增加了对I2C器件响应超时异常的判断。

Application Report, Using the MSP430 Launchpad as a Standalone I2C Host for Audio Products, SLAA605A

—— 除了USCI I2C,还包含了GPIO I2C的驱动代码。

Application Report, Interfacing an EEPROM via I2C Using the MSP430, SLAA208A

—— 驱动封装了操作EEPROM的I2C函数。

二、USCI I2C Master 驱动

I2C驱动使用SLAA382A提供的USCI I2C Master Library(without DMA support),将其中的TI_USCI_I2C_master.c代码device specific header修改#include相关头文件为:

#include "io430.h"

(IAR的project option中已选择器件为G2553)

在TI_USCI_I2C_receiveinit()和TI_USCI_I2C_transmitinit()函数中修改对应的管脚,将P3SEL |= SDA_PIN + SCL_PIN; 注释掉,增加:

P1SEL |= SDA_PIN + SCL_PIN;
P1SEL2|= SDA_PIN + SCL_PIN;

修改TI_USCI_I2C_master.h中SDA_PIN和SCL_PIN的定义:

#define SDA_PIN BIT7
#define SCL_PIN BIT6

这样,硬件I2C驱动部分就大功告成了。剩下的就是调用驱动代码中的函数,完成与外部器件的通讯功能。

三、使用示例——MSP430G2553读取温湿度传感器Si7021

Si7021芯片的介绍可参考之前一篇文章

Si7021模块从淘宝购买,原来以为板子自带I2C上拉电阻的,后来才发现模块的上拉电阻并没有焊接到VDD上,还需要自己把背面三个焊点焊在一起才行。

  

以下代码每隔2s测量一次温湿度,并通过串口打印结果。printf()函数的使用可参考之前另一篇文章

 // msp430G2553 i2c bus <-> Si7021 humidity & temperature sensor
// pullup resistors for SDA & SCL lines: 10kOhm
// jumper for LED2 should be removed, or I2C bus won't work. #include "io430.h"
#include "TI_USCI_I2C_master.h" #define SI7021_ADDRESS 0x40
#define MEASURE_RH_HOLD 0xE5
#define MEASURE_RH_NO_HOLD 0xF5
#define READ_T_FROM_PRE_RH_MEASUREMENT 0xE0 #define RXD BIT1 //P1.1
#define TXD BIT2 //P1.2 unsigned char array[] = {};
unsigned char store[] = {, , };
unsigned int outHumi = ;
float valueHumi = 0.0;
int outTemp = ;
float valueTemp = 0.0; // functions for printf()
void sendByte(unsigned char);
void printf(char *, ...);
void initUART(void);
void printf_f(float); void main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD; // DCO setup
BCSCTL1 = CALBC1_1MHZ;
DCOCTL = CALDCO_1MHZ; // UART setup
initUART(); __enable_interrupt(); while()
{
TI_USCI_I2C_transmitinit(SI7021_ADDRESS, ); // init transmitting with USCI
// scl clock: f(BRCLK)/10; BRCLK <- SMCLK
while(TI_USCI_I2C_notready()); // wait for bus to be free array[] = MEASURE_RH_NO_HOLD;
TI_USCI_I2C_transmit(, array);
while(TI_USCI_I2C_notready()); __delay_cycles(); //delay 25ms // get the humidity result
TI_USCI_I2C_receiveinit(SI7021_ADDRESS, );
while(TI_USCI_I2C_notready()); TI_USCI_I2C_receive(,store);
while(TI_USCI_I2C_notready()); outHumi = (store[]<<) | store[];
valueHumi = 125.0*outHumi/ - ; //printf("heX %x\r\n", outHumi);
//printf("heX %x\r\n", (unsigned int)store[2]);
//printf("Integer %i\r\n", (int)valueHumi);
printf_f(valueHumi);
printf(" %%RH "); // get temperature from previous RH measurement
TI_USCI_I2C_transmitinit(SI7021_ADDRESS, );
while(TI_USCI_I2C_notready());
array[] = READ_T_FROM_PRE_RH_MEASUREMENT;
TI_USCI_I2C_transmit(, array);
while(TI_USCI_I2C_notready()); TI_USCI_I2C_receiveinit(SI7021_ADDRESS, ); // init receiving with USCI
while(TI_USCI_I2C_notready()); // wait for bus to be free
TI_USCI_I2C_receive(,store);
while(TI_USCI_I2C_notready()); outTemp = (store[]<<) | store[];
valueTemp = 175.72*outTemp/ - 46.85; //printf("heX %x\r\n", outTemp);
//printf("Integer %i\r\n", (int)valueTemp);
printf_f(valueTemp);
printf(" `C\r\n"); __delay_cycles(); //delay 2s
}
} void initUART(void) {
//config P1.1 RXD, P1.2 TXD
P1SEL |= TXD + RXD;
P1SEL2 |= TXD + RXD; //reset UCA0, to be configured
UCA0CTL1 = UCSWRST;
//config
UCA0CTL1 |= UCSSEL_2; //SMCLK
UCA0BR0 = ;
UCA0BR1 = ;//1MHz baut rate = 9600
UCA0MCTL = UCBRS0; // Modulation UCBRSx = 1
//make UCA0 out of reset
UCA0CTL1 &= ~UCSWRST;
} void sendByte(unsigned char byte )
{
while (!(IFG2&UCA0TXIFG)); // USCI_A0 TX buffer ready?
UCA0TXBUF = byte; // TX -> RXed character
} void printf_f(float fnumber)
{
int ipart = (int)fnumber; // integer part
int fpart = (int)((fnumber - ipart)*); //fractional part, 2 decimal places printf("%i.", ipart); if(fpart<)
{
fpart = -fpart;
}
if(fpart<)
{
printf("");
}
printf("%i", fpart);
}

程序输出结果如图所示。

MSP430G2553 Launchpad 硬件I2C驱动的更多相关文章

  1. 4、CC2541芯片中级教程-OSAL操作系统(简单AT指令实现+IIC软件和硬件实现驱动MPU6050)

    本文根据一周CC2541笔记汇总得来—— 适合概览和知识快速索引—— 全部链接: 中级教程-OSAL操作系统\OSAL操作系统-实验01 OSAL初探 [插入]SourceInsight-工程建立方法 ...

  2. Smart210学习记录-----Linux i2c驱动

    一:Linux i2c子系统简介: 1.Linux 的 I2C 体系结构分为 3 个组成部分: (1) I2C 核心. I2C 核心提供了 I2C 总线驱动和设备驱动的注册.注销方法,I2C 通信方法 ...

  3. linux下i2c驱动笔记 转

    1. 几个基本概念 1.1. 设备模型 由 总线(bus_type) + 设备(device) + 驱动(device_driver) 组成,在该模型下,所有的设备通过总线连接起来,即使有些设备没有连 ...

  4. linux i2c驱动架构-dm368 i2c驱动分析

      linux i2c驱动架构-dm368 i2c驱动分析   在阅读本文最好先熟悉一种i2c设备的驱动程序,并且浏览一下i2c-core.c以及芯片提供商的提供的i2c总线驱动(i2c-davinc ...

  5. LPC4370使用学习:GPIO的引脚功能使用,和12864OLED模拟I2C驱动

    一: 手中有块LPC4370的开发板,因为便宜,所以引脚引出的不多,而且只有基本的底板资源驱动代码和例程. 看着手册和例程看了老半天,写程序写了半天,结果GPIO老是驱动不起来,因为引脚配置寄存器中有 ...

  6. STM32硬件IIC驱动设计(转)

    源: STM32硬件IIC驱动设计 参考: STM32—硬件IIC主机通信 STM32’s I2C 硬件BUG引发的血案(qzm) 解决STM32 I2C接口死锁在BUSY状态的方法讨论

  7. 【驱动】linux下I2C驱动架构全面分析

    I2C 概述 I2C是philips提出的外设总线. I2C只有两条线,一条串行数据线:SDA,一条是时钟线SCL ,使用SCL,SDA这两根信号线就实现了设备之间的数据交互,它方便了工程师的布线. ...

  8. Linux的操作系统I2C驱动架构解说

    Linux的操作系统I2C驱动架构解说 发布时间:2006.10.16 04:52 来源:赛迪网技术社区 作者:LoneStar 最近因为工作需要涉及到了I2C总线.虽然我过去用过I2c,但看了 Li ...

  9. Linux内核调用I2C驱动_驱动嵌套驱动方法

    禁止转载!!!! Linux内核调用I2C驱动_以MPU6050为例 0. 导语 最近一段时间都在恶补数据结构和C++,加上导师的事情比较多,Linux内核驱动的学习进程总是被阻碍.不过,十一假期终于 ...

随机推荐

  1. Executors中的几种线程调用方式

    一.Executors是java5以后提供的一套api,使用跟上面非常方便.Sun在Java5中,对Java线程的类库做了大量的扩展,其中线程池就是Java5的新特征之一,除了线程池之外,还有很多多线 ...

  2. grunt 不是内部或外部命令,也不是可运行的程序或批处理文件

    问题1 grunt 不是内部或外部命令,也不是可运行的程序或批处理文件 解决方法: Grunt和 Grunt 插件是通过 npm 安装并管理的,npm是 Node.js 的包管理器. 安装CLI 在继 ...

  3. 在线OFFICE方案

    Office在线预览及PDF在线预览的实现方式大集合 在线浏览office 文件 在线预览文档openoffice+swfTool 类百度文库文档上传.转换和展示功能项目开源代码 微软的office ...

  4. 「小程序JAVA实战」小程序的横向视频和页面拦截(59)

    转自:https://idig8.com/2018/09/24/xiaochengxujavashizhanxiaochengxudehengxiangshipinheyemianlanjie58/ ...

  5. 横向文本框 index获取索引 和 eq 实现

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. x264改变输出分辨率的算法<转>

    x264改变输出分辨率的算法 在某些应用场景下,x264的输入视频分辨率与接收端输出的视频分辨率不同.例如编码端摄像头采集到的YUV数据为1280x720,而接收端视频显示窗口为640x480.对于这 ...

  7. iOS 通过URL网络获取XML数据的两种方式

    转载于:http://blog.csdn.net/crayondeng/article/details/8738768 下面简单介绍如何通过url获取xml的两种方式. 第一种方式相对简单,使用NSD ...

  8. kafka启动报java.net.UnknownHostException

    kafka启动报java.net.UnknownHostException 参考资料: 1.https://blog.csdn.net/zdxiq000/article/details/6258765 ...

  9. BashProfile

    [BashProfile] ~/.bash_profile. alias ll='ls -l -G -a' alias gp='grep --colour -R'

  10. Rigidbody中 Angular Drag (角阻力):

    Rigidbody中 Angular Drag  (角阻力):同样指的是空气阻力,只不过是用来阻碍物体旋转的.如果设置成无限的话,物体会立即停止旋转.如果设置成0,物体在上升过程中,会发生侧翻旋转. ...