请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
部件号: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;
}
}