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/MSP430FR2311:I2C工作时遇到问题

Guru**** 2411470 points
Other Parts Discussed in Thread: MSP430FR2311, HDC1080

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/656878/ccs-msp430fr2311-trouble-getting-i2c-to-work

部件号:MSP430FR2311
主题中讨论的其他部件: HDC1080

工具/软件:Code Composer Studio

各位专家,您好!

我正在尝试让MSP430FR2311通过I2C与HDC1080进行通信。  我的工作电压为3.3V,每条线路上都有10k上拉,I2C总线上没有其它连接。  我已经反复检查过,没有短路,电容低。

我想使用DriverLib库,但似乎无法使它们正常工作。  现在,我只是尝试从寄存器0xFF中获取设备ID,以验证通信是否正常。  您能否查看我的代码并查看是否存在明显错误?

#include "driverlib.h"

void main(void){

//打开子系统时钟
cs_turnOnSMCLK();//这似乎有助于I2C通信-添加此项后,它几乎不会一直挂起。

//停止WDT
WDT_A_HOLD (WDT_A_BASE);

//将所有GPIO初始化为所需的输出
GPIO _setAsOutputPin (GPIO_PORT_P1, GPIO _PIN0);// nc.
GPIO _setAsOutputPin (GPIO端口P1,GPIO _PIN1);// nc.
GPIO _setAsOutputPin (GPIO端口P1,GPIO _PIN2);//用作I2C UCB0SDA
GPIO _setAsOutputPin (GPIO端口P1,GPIO _PIN3);//用作I2C UCB.S.
GPIO _setAsOutputPin (GPIO_PORT_P1, GPIO _PIN4);// nc.
GPIO _setAsOutputPin (GPIO_PORT_P1, GPIO _PIN5);// nc.
GPIO _setAsOutputPin (GPIO端口P1,GPIO _PIN6);//设置2V0
GPIO _setAsOutputPin (GPIO端口P1,GPIO _PIN7);//设置3V3

//将I2C引脚分配给USI_B0
GPIO_setAsPeripheralModuleFunctionInputPin (
GPIO端口P1,
GPIO _PIN2 | GPIO _PIN3,
GPIO主要模块功能
);

GPIO _setAsOutputPin (GPIO端口P2,GPIO _PIN0);//串行器
GPIO _setAsOutputPin (GPIO端口P2,GPIO _PIN1);// SRCLK
GPIO _setAsOutputPin (GPIO端口P2,GPIO _PIN2);// RCLK
GPIO _setAsOutputPin (GPIO端口P2,GPIO _PIN3);// OE_n
GPIO _setAsOutputPin (GPIO端口P2,GPIO _PIN4);// SRCLR_n
GPIO _setAsOutputPin (GPIO端口P2,GPIO _PIN5);// nc.
//gPIO_setAsOutputPin (gPIO_PORT_P2,gPIO_PIN6);//用于XOUT (晶体)
//gPIO_setAsOutputPin (gPIO_PORT_P2,gPIO_PIN7);//用于XIN

GPIO _setOutputLowOnPin (GPIO_PORT_P1, GPIO _PIN6 | GPIO _PIN7 );
GPIO _setOutputLowOnPin (GPIO_PORT_P2, GPIO _PIN0 | GPIO _PIN1 | GPIO _PIN2 | GPIO _PIN3 );
GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN4);//禁用低电平有效清除

//禁用GPIO开机默认高阻抗模式
//*这是让我的程序开始工作的关键:)
pm_unlockLPM5();

//初始化I2C操作
EUSCI_B_I2C_initMasterParam MASTER_PARAm ={0};
master_param.selectClockSource = EUSCI_B_I2C_CLOCKSOURCE_SMCLK;
MASTER_param.i2cClk = EUSCI_B_I2C_SET_DATA_RATE_100KBPS;
EUSCI_B_I2C_INITMASTER (EUSCI_B0_BBASE,&MASTER_param);
EUSCI_B_I2C_setSlaveAddress(EUSI_B0_BBASE,0x40);//地址是7位,从1开始
EUSCI_B_I2C_setMode (EUSCI_B0_BBASE,EUSCI_B_I2C_Transmit_mode);
EUSCI_B_I2C_ENABLE (EUSCI_B0_BASE);
//据推测,I2C将在此时起作用。

//向HDC1080传感器发送软件重置
//配置设备-- 0x9000表示“重置设备并同时获取温度和湿度”
EUSCI_B_I2C_masterSendMultiByteStart (EUSCI_B0_BASE,0x02);
EUSCI_B_I2C_masterSendMultiByteNext(EUSI_B0_Base,0x90);
EUSCI_B_I2C_masterSendMultiByteNext(EUSI_B0_Base,0x00);
EUSCI_B_I2C_masterSendMultiByteStop(EUSI_B0_base);

//获取设备地址(希望)
UINT16_t下字节= 0;
UINT16_t上字节= 0;

EUSCI_B_I2C_masterSendSingleByte (EUSCI_B0_BBASE,0xFF);__DELAY周期(I2C_DELAY);
EUSCI_B_I2C_DISAB(EUSI_B0_BASE);//我尝试过使用和不使用禁用/启用代码--这两种方法都不起作用。
EUSCI_B_I2C_setMode (EUSCI_B0_BBASE,EUSCI_B_I2C_Receive_mode);
EUSCI_B_I2C_ENABLE (EUSCI_B0_BASE);//
EUSCI_B_I2C_masterReceiveStart (EUSCI_B0_BASE);
upperbyte = EUSCI_B_I2C_masterReceiveMultiByteNext(EUSI_B0_BUSB);
lowerbyte = EUSCI_B_I2C_masterReceiveMultiByteNext(EUSI_B0_base);
EUSCI_B_I2C_masterReceiveMultiByteStop (EUSCI_B0_BASE);

lowerbyte |= upperbyte <<8;//此时应包含0x1050或十进制4176。

	//此时,降低字节_should _包含0x1050,但我得到的只是0x0000。
	//似乎不知道我做错了什么。
	
同时(1)
{
//我的循环代码将出现在此处
}
//结束
} 

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

    似乎您可能设置了错误的eUSCI外围设备,也可能设置了SMCLK。 我建议您查看下面TI资源浏览器中链接的示例,了解如何正确设置eUSCI外设以进行I2C通信。 还有许多其他示例显示了不同的用例,如从属,主等

    dev.ti.com/.../

    此致,
    Caleb Overbay
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢Caleb,
    显然,自我拥有的版本以来,对资源管理器/DriverLib示例进行了一些添加。 这些新示例非常有用!