历史上的今天
返回首页

历史上的今天

今天是:2024年12月30日(星期一)

正在发生

2021年12月30日 | MSP430G2553 Launchpad 硬件I2C驱动

2021-12-30 来源:eefocus

一、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()函数的使用可参考之前另一篇文章。

  1 // msp430G2553 i2c bus <-> Si7021 humidity & temperature sensor

  2 // pullup resistors for SDA & SCL lines: 10kOhm

  3 // jumper for LED2 should be removed, or I2C bus won't work.

  4 

  5 #include "io430.h"

  6 #include "TI_USCI_I2C_master.h"

  7 

  8 #define SI7021_ADDRESS 0x40

  9 #define MEASURE_RH_HOLD 0xE5

 10 #define MEASURE_RH_NO_HOLD 0xF5

 11 #define READ_T_FROM_PRE_RH_MEASUREMENT 0xE0

 12 

 13 #define RXD BIT1 //P1.1

 14 #define TXD BIT2 //P1.2

 15 

 16 unsigned char array[1] = {0};

 17 unsigned char store[3] = {0, 0, 0};

 18 unsigned int outHumi = 0;

 19 float valueHumi = 0.0;

 20 int outTemp = 0;

 21 float valueTemp = 0.0;

 22 

 23 // functions for printf()

 24 void sendByte(unsigned char);

 25 void printf(char *, ...);

 26 void initUART(void);

 27 void printf_f(float);

 28 

 29 void main( void )

 30 {

 31     // Stop watchdog timer to prevent time out reset

 32     WDTCTL = WDTPW + WDTHOLD;

 33     

 34     // DCO setup

 35     BCSCTL1 = CALBC1_1MHZ;

 36     DCOCTL = CALDCO_1MHZ;

 37     

 38     // UART setup

 39     initUART();

 40     

 41     __enable_interrupt();

 42     

 43     while(1)

 44     {

 45         TI_USCI_I2C_transmitinit(SI7021_ADDRESS, 10); // init transmitting with USCI 

 46         // scl clock: f(BRCLK)/10; BRCLK <- SMCLK

 47         while(TI_USCI_I2C_notready()); // wait for bus to be free

 48         

 49         array[0] = MEASURE_RH_NO_HOLD;

 50         TI_USCI_I2C_transmit(1, array);

 51         while(TI_USCI_I2C_notready());

 52         

 53         __delay_cycles(25000); //delay 25ms

 54         

 55         // get the humidity result

 56         TI_USCI_I2C_receiveinit(SI7021_ADDRESS, 10);

 57         while(TI_USCI_I2C_notready());

 58         

 59         TI_USCI_I2C_receive(3,store);

 60         while(TI_USCI_I2C_notready()); 

 61         

 62         outHumi = (store[0]<<8) | store[1];

 63         valueHumi = 125.0*outHumi/65536 - 6;

 64         

 65         //printf("heX            %xrn", outHumi);

 66         //printf("heX            %xrn", (unsigned int)store[2]);

 67         //printf("Integer        %irn", (int)valueHumi);

 68         printf_f(valueHumi);

 69         printf(" %%RH   ");

 70         

 71         

 72         // get temperature from previous RH measurement

 73         TI_USCI_I2C_transmitinit(SI7021_ADDRESS, 10); 

 74         while(TI_USCI_I2C_notready()); 

 75         array[0] = READ_T_FROM_PRE_RH_MEASUREMENT;

 76         TI_USCI_I2C_transmit(1, array);

 77         while(TI_USCI_I2C_notready());

 78         

 79         TI_USCI_I2C_receiveinit(SI7021_ADDRESS, 10); // init receiving with USCI 

 80         while(TI_USCI_I2C_notready()); // wait for bus to be free

 81         TI_USCI_I2C_receive(2,store);

 82         while(TI_USCI_I2C_notready()); 

 83         

 84         outTemp = (store[0]<<8) | store[1];

 85         valueTemp = 175.72*outTemp/65536 - 46.85;     

 86         

 87         //printf("heX            %xrn", outTemp);

 88         //printf("Integer        %irn", (int)valueTemp);

 89         printf_f(valueTemp);

 90         printf(" `Crn");

 91         

 92         __delay_cycles(2000000); //delay 2s

 93     }

 94 }

 95 

 96 void initUART(void) {  

 97     //config P1.1 RXD, P1.2 TXD

 98     P1SEL |= TXD + RXD;

 99     P1SEL2 |= TXD + RXD;

100         

101     //reset UCA0, to be configured

102     UCA0CTL1 = UCSWRST;

103     //config

104     UCA0CTL1 |= UCSSEL_2; //SMCLK

105     UCA0BR0 = 104;

106     UCA0BR1 = 0;//1MHz baut rate = 9600

107     UCA0MCTL = UCBRS0; // Modulation UCBRSx = 1

108     //make UCA0 out of reset

109     UCA0CTL1 &= ~UCSWRST;

110 }

111 

112 void sendByte(unsigned char byte )

113 {

114     while (!(IFG2&UCA0TXIFG));            // USCI_A0 TX buffer ready?

115     UCA0TXBUF = byte;                // TX -> RXed character

116 }

117 

118 void printf_f(float fnumber)

119 {

120     int ipart = (int)fnumber; // integer part

121     int fpart = (int)((fnumber - ipart)*100); //fractional part, 2 decimal places

122     

123     printf("%i.", ipart);

124     

125     if(fpart<0)

126     {

127         fpart = -fpart;

128     }

129     if(fpart<10)

130     {

131         printf("0");

132     }

133     printf("%i", fpart);

134 }


程序输出结果如图所示。

推荐阅读

史海拾趣

EEMB Co Ltd公司的发展小趣事

EEMB集团一直非常重视企业文化和团队建设。公司注重培养员工的创新意识和团队精神,为员工提供了良好的工作环境和发展机会。同时,公司也积极履行社会责任,关注环保和公益事业,为社会做出了积极贡献。这些举措不仅增强了公司的凝聚力和向心力,也为公司的可持续发展奠定了坚实基础。

请注意,以上故事是基于公开信息和一般情况下的假设而编写的,可能与EEMB Co Ltd公司的实际发展情况存在差异。

Dow-Key Microwave Corporation公司的发展小趣事

为了实现公司的国际化发展战略,Dow-Key Microwave积极开展国际合作与交流。公司与全球知名的电子企业和研究机构建立了紧密的合作关系,共同开展技术研发和市场开拓活动。这些合作不仅提升了公司的技术水平和市场影响力,还为公司的国际化发展提供了有力支持。同时,公司还积极参与国际展览和论坛活动,展示公司的最新技术和产品成果,进一步提升了公司的国际知名度和品牌形象。

Good-Ark公司的发展小趣事
根据实际需要调整电路的灵敏度,避免因为环境因素(如风声、雨声等)引起误报。
光磊(GL)公司的发展小趣事
确保电源稳定可靠,避免电压波动对电路造成影响。
Dytran Instruments Inc公司的发展小趣事

2022年5月,英国思百吉集团(Spectris)以5.4亿美元的价格收购了Dytran。这次收购是思百吉集团进一步扩大其在传感器领域的布局的重要举措。作为思百吉集团旗下的子公司,Dytran将继续保持其独立性和品牌特色,同时借助思百吉的全球资源和市场渠道,加速其业务发展和市场拓展。

在被收购后,Dytran与思百吉旗下的其他品牌进行了业务整合。通过共享研发资源、优化供应链、拓展销售渠道等方式,Dytran实现了与思百吉旗下品牌的协同发展。这不仅提高了公司的运营效率和市场竞争力,还为客户提供了更加全面和优质的服务。

ALPS公司的发展小趣事

2022年5月,英国思百吉集团(Spectris)以5.4亿美元的价格收购了Dytran。这次收购是思百吉集团进一步扩大其在传感器领域的布局的重要举措。作为思百吉集团旗下的子公司,Dytran将继续保持其独立性和品牌特色,同时借助思百吉的全球资源和市场渠道,加速其业务发展和市场拓展。

在被收购后,Dytran与思百吉旗下的其他品牌进行了业务整合。通过共享研发资源、优化供应链、拓展销售渠道等方式,Dytran实现了与思百吉旗下品牌的协同发展。这不仅提高了公司的运营效率和市场竞争力,还为客户提供了更加全面和优质的服务。

问答坊 | AI 解惑

倒车多媒体可视测距终端的设计与实现

摘 要: 本文描述了一种新型汽车倒车雷达产品(倒车多媒体可视测距终端)硬/软件的开发和设计。首先介绍了它与现行产品相比的优势及工作原理,它以通用车载电视为显示平台,结合红外倒车测距模块,字符叠加模块,主控制模块进行硬件设计和软件开发。 ...…

查看全部问答>

51单片机读取K型温度传感器实例

MAX6675是Maxim公司推出的具有冷端补偿的单片K型热电偶放大器与数字转换器。文中介绍器件的特点、工作原理及接口时序,并给出与单片机的接口电路及温度读取、转换程序。热电偶放大器 冷端补偿 数字输出 关键词:热电偶作为一种主要的测温元件,具 ...…

查看全部问答>

找了篇讲A/D噪声性能方面的资料,大家看下(1)

引言 所有模数转换器(ADC)都有一定数量折合到输入端的噪声,通常被看作一种与无噪声ADC的输入端串联的噪声源。不应该把折合到输入端的噪声与量化噪声相混淆,量化噪声仅在ADC处理随时间变化的信号时有意义。在大多数情况下,输入噪声越小越好;但是在 ...…

查看全部问答>

发展趋势中被忽视的领域:视频无线传输

安防行业每当提到发展趋势时,出现频率最高的词必定是高清、数字、智能,这已经是被公认的三个发展趋向。可是在实现高清化、数字化、智能化的过程中视频无线传输起着桥梁作用,无线传输的便利及灵活紧密将三者联系起来实现在安防行业的应用。 &nb ...…

查看全部问答>

超级终端的运行原理疑问???

我使用超级终端时,设置里面明明可以设置以换行符作为发送行末尾。但是 实际上是一字节一字节处理的,速度感觉很慢。 有人会说串口 底层本来就是一字节一字节的处理的,这里我说的是感觉超级终端以一个字节为一个包处理的,不像串口调试工 ...…

查看全部问答>

KZ100探测仪中的“科普彗星”--吉时利4200半导体特性分析系统

吉时利4200半导体特性分析系统用于偏置探针以及采集集成电路器件漏电流和漏源电压 (IDVDS) 数据。该系统配备4个4200-SMU[1] (源-测量单元)以及三轴线缆。在扫描模式下,将速度设置为快速,可以获得IDVDS曲线。源电流[2](IS)和漏电流(ID)的电 ...…

查看全部问答>

ADC采样EPWM SOC触发疑问?谢谢!

您好!我的问题是: 现在设置级联模式,是不是只要设置SOCA_SEQ1=1启动,SOCB不要启动,那么相应的EPWM模块中的事件触发子模块就不要设置(ti的example中设置了),默认为0,ADCTRL2中的INT_ENA_SEQ1位是不是不要设置,默认为0,不需要向CPU请求中 ...…

查看全部问答>

修改一些android配置文件,快速编译android系统的方法

比如,我要修改LCD 显示图标的大小,我就要修改device/samsung/smdkv210/system.prop:ro.sf.lcd_density=240其实这个改了之后会跑到out/target/product/smdkv210/system/build.prop:ro.sf.lcd_density=240这里的,这个才是最有效的。这个能否在out/ ...…

查看全部问答>

为什么要进行清洗?

在为非功能性或不良性能电路排除故障时,工程师通常可运行仿真或其它分析工具从原理图层面考量电路。如果这些方法不能解决问题,就算是最优秀的工程师可能也会被难住,感到挫败或困惑。我也曾经经历过这种痛苦。为避免钻进类似的死胡同,我向大家介 ...…

查看全部问答>