一、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);
}

程序输出结果如图所示。

最新文章

  1. Hibernate Hql 总结(2)---laoyang
  2. ionic day01教程第一天之多平台运行(ios & android)
  3. 网页游戏外挂辅助AMF模拟通讯必备
  4. javascript 中的 delete
  5. spring boot实战(第十三篇)自动配置原理分析
  6. 请使用-Xlint:deprecation重新编译
  7. Java - 正则表达式常用操作
  8. memmove 和 memcpy的区别
  9. COJ 0580 4021征兵方案
  10. My97DatePicker日历控件日报、每周和每月的选择
  11. RAC(ReactiveCocoa)使用方法(一)
  12. JavaScript的基础学习
  13. iOS开发基础之开发证书的说明和发布
  14. Miller_Rabbin&amp;&amp;Pollard_Rho 学习笔记
  15. GC(垃圾处理机制)面试题
  16. 学习笔记54—均方误差(MSE)和均方根误差(RMSE)和平均绝对误差(MAE)
  17. freetds 移植
  18. laravel命令
  19. 解决 idea template jsp模板中使用自定义路径 模板不显示问题
  20. UNIX网络编程读书笔记:基本TCP套接口编程

热门文章

  1. 深入理解 Express.js
  2. 合并SCVMM虚拟机的差异磁盘,并删除那些难以删除的Checkpoints(Shapshots)
  3. Java各种Utils小结
  4. 关于hibernate4.3版本之后org.hibernate.service.ServiceRegistryBuilder被弃用
  5. 提示框一段时间以后消失setTimeout
  6. LUA表的引用理解
  7. Cardboard Talk02 Accelerometer
  8. 【320】Python 2.x 与 3.x 的区别
  9. 归纳整理Linux下C语言常用的库函数----字符串转换、字符测试、及内存控制
  10. BashProfile