请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
部件号: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)
{
//我的循环代码将出现在此处
}
//结束
}