This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/MSP430G2553:FDC1004的 I2C 代码

Guru**** 2024750 points
Other Parts Discussed in Thread: MSP430G2553, FDC1004EVM, ENERGIA
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/565877/ccs-msp430g2553-i2c-code-for-fdc1004

器件型号:MSP430G2553
主题中讨论的其他器件: FDC1004EVMENERGIA

工具/软件:Code Composer Studio

你(们)好  

我正在开发一个电路板、使用 MSP430G2553和 FDC 测量电容的变化。 我将硬件和以下代码进行构建。  

我尝试读取器件 ID、但我只读取 ID 的第一个字节而不是第二个字节、如果我删除 LPM 指令代码不起作用、请告诉我在开发此代码时缺少了什么。

#include


内部 TXByteCtr;
unsigned char PRxData[3];
INT Rx = 0;
int i=0;
char REG_ID= 0xFE;

char itgAddress = 0x50;

void init_I2C (void);
void transmit (void);
接收无效(无效);


int main (空)

WDTCTL = WDTPW + WDTHOLD;//停止 WDT
P1SEL |= BIT6 + BIT7;//将 I2C 引脚分配给 USCI_B0
P1SEL2|= BIT6 + BIT7;//将 I2C 引脚分配给 USCI_B0
init_i2C();


while (1){
//传输过程
RX = 0;
TXByteCtr = 1;
Transmit ();
//接收过程
RX = 1;
receive();

///----------------------------------
// USCI_B0数据 ISR 用于移动从 I2C 从设备接收到的数据
//到 MSP430内存。 它的结构使其可用于接收
///----------------------------------
#pragma vector = USCIAB0TX_vector
_interrupt void USCIAB0TX_ISR (void)

if (rx = 1){//主机接收?
for (i=0;i<3;i++)

PRxData[i]= UCB0RXBUF;//获取 RX 数据
_BIC_SR_REGISTER_ON_EXIT (CPUOFF);//退出 LPM0

else{//主机发送
if (TXByteCtr)//检查 TX 字节计数器

UCB0TXBUF = REG_ID;//加载 TX 缓冲区
TXByteCtr -;//减量 TX 字节计数器

其他

UCB0CTL1 |= UCTXSTP;// I2C 停止条件
IFG2 &=~UCB0TXIFG;//清除 USCI_B0 TX 内部标志
_BIC_SR_REGISTER_ON_EXIT (CPUOFF);//退出 LPM0


void init_I2C (void){
UCB0CTL1 |= UCSWRST;//启用 SW 复位
UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC;// I2C 主器件、同步模式
UCB0CTL1 = UCSSEL_2 + UCSWRST;//使用 SMCLK、保持软件复位
UCB0BR0 = 12;// fSCL = SMCLK/12 =~100kHz
UCB0BR1 = 0;
UCB0I2CSA = itgAddress;//从器件地址为069h
UCB0CTL1 &=~UCSWRST;//清除 SW 复位,恢复运行
IE2 |= UCB0RXIE + UCB0TXIE;//启用 RX 和 TX 中断

void transmit (void){
while (UCB0CTL1 & UCTXSTP);//确保发送了 STOP 条件
UCB0CTL1 |= UCTR + UCTXSTT;// I2C TX、启动条件
_bis_SR_register (CPUOFF+GIE);//通过中断输入 LPM0

接收无效(无效)

while (UCB0CTL1 & UCTXSTP);//确保发送了 STOP 条件
UCB0CTL1 &=~UCTR;//清除 UCTR
UCB0CTL1 |= UCTXSTT;// I2C 启动条件
while (UCB0CTL1 & UCTXSTT);//起始条件是否发送?
UCB0CTL1 |= UCTXSTP;// I2C 停止条件
_bis_SR_register (CPUOFF+GIE);//通过中断输入 LPM0

此致

南迪什

 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、南迪什、

    假设传输段正常工作并且硬件连接稳定、因为您能够读取第一个字节、则需要专门处理涉及接收多个字节的代码。 请参阅 msp430g2xx3_uscib0_i2c_[10&12].c 代码示例、了解有关如何正确设置此设置的更多信息。 您在请求第一个 ID 字节后、似乎会立即停止 I2C 序列。 您还应该在任何时候只启用 RXIE 或 TXIE。 以下是用于其他参考的 FDC1004EVM Energia 代码: www.ti.com/.../snvc187

    此致、
    Ryan