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/MSP432P401R:多个从属设备(I2C)

Guru**** 2587365 points
Other Parts Discussed in Thread: MSP432WARE

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/621605/ccs-msp432p401r-multiple-slave-devices-i2c

部件号:MSP432P401R
主题中讨论的其他部件:MSP432WARE

工具/软件:Code Composer Studio

您好,

我是MSP432和编程的初学者。

我尝试读取四个传感器:2x SHT31 (温度和湿度传感器)和2x SFM3000 (流量传感器)。

我只读 了两遍,但从未全部读过。 我需要一个多个从属设备的代码示例或一些可以帮助我的东西。

这是我的代码:

#include "msp.h"

unsigned char RXData;

const unsigned int cu16SFM3000MeasureCommand = 0x1000;
const unsigned char cu8SFM3000Address = 0x40;


const uint16_t cu16SHT31MeasureCommand = 0x240B;
const uint8_t cu8SHT31Address = 0x44;



typedef struct
{

unsigned char u8TxCount;
unsigned char u8RxCount;

无符号int u16FlowData;
浮点fFlowDataCalculated;
unsigned char u8crc;

uINT16_t u16TempData;
浮点fTempDataCalculated;
UINT8_t u8CRCTemp;

uINT16_t u16HumData;
fHumDataCalculated浮点;
UINT8_t u8CRCHum;


}var;

var FirstSensorF,SecondSensorF,FirstSensorT,SecondSensorT;

#define offset_flow 3.2万.0F // offset flow
#define scale_flow 140.0F // Scale factor flow


extern void EUSCIB1_IRQHandler();

int main(void){

易失性UINT32_t I;
WDT_A->CTL = WDT_A_CTL_PW | WDT_A_CTL_HOLD; //停止监视计时器


//配置GPIO
P6SEL0 || BIT4 | BIT5;// I2C引脚
P1SEL0 || BIT6 | BIT7;// I2C引脚

__enable_interrupit();
NVIC->ISER[0]|=1<<(EUSIB1_IRQn)和31);//在NVIC模块中启用eUSCIB1中断
NVIC->ISER[0]|=1<<(EUSIB0_IRQn)和31);


//为I2C模式配置USI_B1


同时(1)
{

//为I2C模式配置USI_B1
UCB1CTLW0 |= UCSWRST;//软件重置已启用
UCB1CTLW0 |= UCMODE_3| UCMST | UCSYNC;// I2C模式,从属模式,同步
UCB1BRW = 192;
UCB1CTLW0 |= UCTR;
UCB1I2CSA = cu8SFM3000地址;
FirstSensorF.u8TxCount = 2;
UCB1CTLW0 &=~UCSWRST;
UCB1IE = UCTXIE | UCNACKIE;
UCB1CTLW0 |= UCTXSTT;// I2C启动条件

用于(i =2万;i >0;i --);

UCB1CTLW0 |= UCSWRST;
UCB1CTLW0 |= UCMODE_3 | UCCMST | UCSYNC;
UCB1CTLW1 |= UCASTP_2;//生成自动停止
UCB1CTLW0 &=~UCTR;
//在到达UCB0TBCNT之后
UCB1BRW = 192;//波特率= SMCLK / 192
UCB1TBCNT =3;//要接收的字节数
FirstSensorF.u8RxCount = 3;
UCB1I2CSA = cu8SFM3000地址;
UCB1CTLW0 &=~UCSWRST;
UCB1IE |= UCRXIE | UCNACKIE | UCBCNTIE;

用于(i =2万;i >0;i --);

while (UCB1CTLW0和UCTXSTP);//确保已发送停止条件
UCB1CTLW0 |= UCTXSTT;// I2C启动条件

UCB0CTLW0 |= UCSWRST;
UCB0CTLW0 |= UCMODE_3;
UCB0CTLW0 |= UCMST;
UCB0CTLW0 |=UCSYNC;
UCB0BRW =192;
UCB0CTLW0 |= UCTR;//发送器
UCB0I2CSA = cu8SHT31地址;
secondSensorT.u8TxCount = 2;//发送两个字节的数据
UCB0CTLW0 &=~UCSWRST;//软件重置启用
UCB0IE = UCTXIE | UCNACKIE;//传输中断启用+不确认中断启用

UCB0CTLW0 |= UCTXSTT;// FirstSensorT启动条件

(i = 1万;i > 0;i --);

UCB0CTLW0 |= UCSWRST;//已启用软件重置
UCB0CTLW0 |= UCMODE_3| UCMST | UCSYNC;// FirstSensorT模式,从属模式,同步
UCB0CTLW1 |= UCASTP_2;
UCB0CTLW0 &=~UCTR;//接收器
//在到达UCB0TBCNT之后
UCB0BRW = 192;//波特率= SMCLK / 192
UCB0TBCNT =6;//要接收的字节数
辅助传感器T.u8RxCount = 6;
UCB0I2CSA = cu8SHT31地址;
UCB0CTLW0 &=~UCSWRST;//软件重置启用
UCB0IE || UCRXIE | UCNACKIE | UCBCNTIE; ENTIE

UCB0CTLW0 |= UCTXSTT;
用于(I =1万;I >0; I--);



}
}//

I2C中断服务例程
void EUSCIB1_IRQHandler(void){

IF (UCB1IFG和UCNACKIFG)
{
UCB1IFG &=~ UCNACKIFG;
UCB1CTLW0|= UCTXSTT;// I2C启动条件
}
IF (UCB1IFG和UCRXIFG0)
{
IF (FirstSensorF.u8RxCount == 3)
{
FirstSensorF.u8RxCount --;
FirstSensorF.u16FlowData = UCB1RXBUF <<8;
}
否则IF (FirstSensorF.u8RxCount == 2)
{
FirstSensorF.u8RxCount --;
FirstSensorF.u16FlowData || UCB1RXBUF;
FirstSensorF.fFlowDataCalculated =(FirstSensorF.u16FlowData - offset_flow)/ scale Flow;
}
否则,如果(FirstSensorF.u8RxCount == 1)
{
FirstSensorF.u8RxCount = 3;
FirstSensorF.u8CRC = UCB1RXBUF;
}
UCB1IFG &=~ UCRXIFG0;
}
IF (UCB1IFG和UCBCNTIFG)
{
UCB1IFG &=~ UCBCNTIFG;
P1OUT ^= BIT0;
}

/* TX */

IF (UCB1IFG和UCTXIFG0)
{

IF (FirstSensorF.u8TxCount == 2)
{
UCB1TXBUF =(cu16SFM3000MeasureCommand >> 8)和0xFF;
FirstSensorF.u8TxCount --;
}
否则IF (FirstSensorF.u8TxCount == 1)
{
UCB1TXBUF = cu16SFM3000MeasureCommand和0xFF;
FirstSensorF.u8TxCount --;
}
否则
{
UCB1CTLW0|= UCTXSTP;// I2C启动条件
}

UCB1IFG &=~UCTXIFG0;
}

}
作废EUSCIB0_IRQHandler(void){

IF (UCB0IFG和UCNACKIFG)
{
UCB0IFG &=~ UCNACKIFG;
UCB0CTLW0|= UCTXSTT;// FirstSensorT启动条件
}
IF (UCB0IFG和UCRXIFG0)
{
IF (辅助传感器T.u8RxCount == 6)
{
辅助传感器T.u8RxCount --;
secondSensorT.u16TempData = UCB0RXBUF <<8;
}
否则,如果(SecondSensorT.u8RxCount == 5)
{
辅助传感器T.u8RxCount --;
辅助传感器T.u16TempData || UCB0RXBUF;
secondSensorT.fTempDataCalculated =-45+(175 *((浮点) secondSensorT.u16TempData /(浮点) 0xffff);
}
否则,如果(SecondSensorT.u8RxCount == 4)
{
辅助传感器T.u8RxCount --;
secondSensorT.u8CRCTemp = UCB0RXBUF;
}
否则IF (secondSensorT.u8RxCount == 3)
{
辅助传感器T.u8RxCount --;
secondSensorT.u16HumData = UCB0RXBUF <<8;
}
否则IF (secondSensorT.u8RxCount == 2)
{
辅助传感器T.u8RxCount --;
secondSensorT.u16HumData |= UCB0RXBUF;
secondSensorT.fHumDataCalculated = 100 *((浮点) secondSensorT.u16HumData /(浮点) 0xff;
}
否则,如果(SecondSensorT.u8RxCount == 1)
{
辅助传感器T.u8RxCount = 6;
辅助传感器T.u8CRCHum = UCB0RXBUF;
}

UCB0IFG &=~ UCRXIFG0;
}


IF (UCB0IFG和UCBCNTIFG)
{
UCB0IFG &=~ UCBCNTIFG;
P1OUT ^= BIT0;//在WFP 1.0 上切换LED
}


/* TX */

IF (UCB0IFG和UCTXIFG0)
{

IF (辅助传感器T.u8TxCount == 2)
{
UCB0TXBUF =(cu16SHT31MeasureCommand >> 8)和0xFF;
secondSensorT.u8TxCount --;
}
否则IF (secondSensorT.u8TxCount == 1)
{
UCB0TXBUF = cu16SHT31 MeasureCommand & 0xFF;
secondSensorT.u8TxCount --;
}
否则
{
UCB0CTLW0|= UCTXSTP;// FirstSensorT启动条件
}

UCB0IFG &=~UCTXIFG0;
}

}


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

    Tamas,

     您的代码似乎基于MSP432ware,而不是当前的SimpleLink MSP432 SDK软件开发套件。 所有新项目都应使用新的SDK, 该SDK可在TI资源浏览器 中找到,网址为dev.ti.com。  

    您的代码片段是使用注册级代码设计的。  您会发现使用driverlib API进行开发更快,更轻松。 Driverlib代码通常更简单,可读性更高。 您可以在本示例中找到一个driverlib示例,该示例显示如何从SimpleLink MSP342 SDK读取/写入多个I2C从属 设备(i2c_master_w_multibyte_multilave)

    此致,

     Bob Landers

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢你Bob!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很高兴这有帮助。 如果您认为此问题现已解决,请单击“TI已解决我的问题”按钮。
    -Bob