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
让我感到困惑的是,它采用10K拉杆的Launchpad在Energia工作,而不是在CCS中工作? 我是否需要在CCS中执行任何其他项目/构建配置?
此致
Vijay博士
我的LaunchPad上的10k电阻器在CCS中工作。 您的IDE和编译器版本是什么? 您可以尝试将您的CCS项目文件发送给我,以便查看是否有用。
此致,
Ryan
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); 返回数据; }