主题中讨论的其他部件:MSP430WARE, ENERGIA
工具/软件:Code Composer Studio
你好
有人能帮我用MSP430FR5xx_6xx Driverlib进行I2C通信的示例代码吗? 我正在尝试连接到具有0x48地址的I2C从属设备并读取寄存器0x10。 我进行了广泛的搜索,但找不到任何可以帮助我入门的示例代码。
此致
维贾伊
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.
工具/软件:Code Composer Studio
你好
有人能帮我用MSP430FR5xx_6xx Driverlib进行I2C通信的示例代码吗? 我正在尝试连接到具有0x48地址的I2C从属设备并读取寄存器0x10。 我进行了广泛的搜索,但找不到任何可以帮助我入门的示例代码。
此致
维贾伊
亲爱的Ryan
BME280与具有Energia代码的同一个启动板完美配合。 我在CCS中使用此代码时遇到问题。 即使我导入到CCS时,Energia代码也能正常工作。 运行多次之后,代码只工作一次。 目前我使用10K上拉电阻器,我也尝试了4.7K电阻器。 两人都在使用Energia,但没有使用此代码。 我还尝试了下面的代码,其中包含您提到的示例中的中断,但它在__BIC_SR_REGISTER_ON_EXIT (LPM0_bits)处卡住;我无法获得TXIFG0中断。
抱歉,我没有示波器,也不知道如何使用。 我是一名医学博士,从事一个污染感测项目。
请参阅下面的代码,并在此处告诉我我做了什么错误。 我花了2周时间才达到这个水平:)
我没有添加任何重新启动以接收。 此代码本身在GEE中被卡住。
________________________________________________________________
#include <msp430fr6989.h>
#define BME280_address 0x77
#define chip_address 0xd0
volatile unsigned TXchar ByteCtr;
unsigned char RX_Data;
int main(void)
{
WDTCTL = WDTPW | WDTHOLD;
P1SEL0 |= BIT6 | BIT7;
PM5CTL0 &=~LOCWS=UCST0
//启用软件重置
UCB0CTLW0 |= UCMODE_3 | UMST | UCSSEL__SMCLK; // I2C主控,同步模式
UCB0BRW = 0x8; // fSCL = SMCLK/12 =~100kHz
UCB0CTLW0 &=~UCSWRST; //清除软件重置,恢复操作
UCB0IE |= UCTXIE0 | UCRXIE0 | UCNACKIE; //启用RX和TX中断
,同时(1)
{
__DELAY周期(1000); //传输之间的延迟
UCB0I2CSA = BME280_address;//配置从属地址
TXByteCtr = 1; //加载TX字节计数器
While (UCB0CTLW0和UCTXSTP); //确保停止条件已发送
UCB0CTLW0 |= UCTR | UCTXSTT; // I2C TX,启动条件
__bis_sr_register(LPM0_bits | GIE);
}
#if
defined(__TI_Compiler_version__)|| defined(__IAR_systems_icc__)
#pragma vector = UISR_B0_vector
__interrupt void USI_B0(SCI)
#Elif defined(__GNU_system_ICC__)#vector = UISR_BUISR_BUVEC_BUVEC_0
#endif
{
Switch(__偶 数_in_range(UCB0IV, USI_I2C_UCBIT9IFG))
{
案例USI_NONE: 中断; //矢量0:无中断
案例USI_I2C_UCALIFG:中断; //矢量2:ALIFG
案例USI_I2C_UCNACKIFG: //矢量4:NACKIFG
UCB0CTLW0 |= UCTXSTT; //如果不确认,请重新发送启动
中断;
案例USI_I2C_UCSTIFG:中断; //向量6:STTIFG
案例USI_I2C_UCSTPIFG:中断; //矢量8:STPIFG
案例USI_I2C_UCRXIFG3:中断; //矢量10:RXIFG3
案例USI_I2C_UCTXIFG3:中断; //矢量12:TXIFG3
案例USI_I2C_UCRXIFG2:中断; //矢量14:RXIFG2
案例USI_I2C_UCTXIFG2:中断; //矢量16:TXIFG2
案例USI_I2C_UCRXIFG1:中断; //矢量18:RXIFG1
案例USI_I2C_UCTXIFG1:中断; //矢量20:TXIFG1
案例USI_I2C_UCRXIFG0:中断; //矢量22:RXIFG0
案例USI_I2C_UCTXIFG0: //矢量24:TXIFG0
IF (TXByteCtr) //检查TX字节计数器
{
UCB0TXBUF =芯片地址; //加载TX缓冲区
TXByteCtr // Decrement TX字节计数
器}
否则
{
UCB0CTLW0 |= UCTXSTP; // I2C停止条件
UCB0IFG &=~UCTXIFG; //清除USI_B0 TX int标志
__BIC_SR_REGISTER_ON_EXIT (LPM0_bits);//退出LPM0
}
中断;
默认值:break;
}
}
Ryan
下面的代码解决了我的问题。 我仍然想知道为什么以前的代码被卡住了。 如果您发现错误,请告诉我。
unsigned char i2c_read(unsigned char slv_addr, unsigned char reg_addr){
无符号char数据=0;
(UCB0STAT和UCBBUSY);
UCB0I2CSA = SLV_addr;
UCB0CTLW0 |= UCTR | UCTXSTT;
while (UCB0CTLW0和UCTXSTT);
UCB0TXBUF = REG_ADDR;
while (!(UCB0IFG和UCTXIFG0));
UCB0CTLW0 &=~UCTR;
UCB0CTLW0 |= UCTXSTT;
while (UCB0CTLW0和UCTXSTT);
UCB0CTLW0 |= UCTXSTP;
while (!(UCB0IFG和UCRXIFG0));
数据= UCB0RXBUF;
while (UCB0CTLW0和UCTXSTP);
返回数据;
}