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.

[参考译文] MSP430FR4133:与 MSP430FR4133连接的外部传感器 MCP9808

Guru**** 1123190 points
Other Parts Discussed in Thread: MSP430FR4133, MSP430FR2100
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/766211/msp430fr4133-external-sensor-mcp9808-interfacing-with-msp430fr4133

器件型号:

工具/软件: IAR Embedded

 您好!

 我是 MSP430和编程的初学者、需要我的项目方面的一些帮助。

项目-通过与 MSP430FR4133的 I2C 通信连接外部温度传感器 MCP9808 、以获取温度值。

连接

SDA 引脚5.2

SCL-引脚5.3

GND-GND

VDD- 3.3V

我  已通过 i2c 通信将温度传感器 MCP9808与 MSP430FR4133连接。  我使用以下代码从传感器读取温度值。 我找不到获得温度值所需的结果。

我在获得所需结果方面面临着问题。

在 MCP9808数据表的配置寄存器部分中、我必须写入该部分

Addressbyte (0x30)、配置指针(0x01)、MSB (0x00)、LSB (0x08)

和读取 Addressbyte (0x31)、(0x00)、(0x08)作为所需结果、但我正在读取 Addressbyte (0x31)、(0x00)、(0x18)、(0x01)。

我附加了由逻辑分析仪获取的结果。 如果能提供任何指导来帮助我了解我出错的地方、我们将不胜感激。

#define I2C_MSP430FR4133_H_

#include 
#include 
#include 
#include 
#include "USCI.h"

#define Ambient temperature0x05
//#define Configuration_Reg0x01
#define DEVICE_ID_REGISTER0x04
#define MANUFACE_ID_REGISTER0x0054
//#define AdressByte0x30


uint16_t tlen = 0;
uint16_t rlen = 0;
int * tx = NULL;
int * rx = NULL;
uint8_t addr = 0x18;
// void * tx =(void *) 0x01;
// void * rx =(void *) 0x00;



volatile unsigned char TempRXData;uintchar
TXData



;void 16 (void t
I2C) unsigned t read (unsigned t inuint16) void t 模式;unsigned t readt id_long (void I2C)
void delay_tick (uint16_t);


unsigned char Adressbyte[10];
unsigned char transmit [10];
unsigned char Meas_receive [10];


int main (void)
{

Stop_WD ();

//禁用 GPIO 上电默认高阻抗模式以激活
//先前配置的端口设置
PM5CTL0 &=~LOCKLPM5;
SET_I2C ();
//发送[0]= 0x30 & 0xFE;
发送[0]= 0x01;
发送[1]= 0x00;
发送[2]= 0x08;

Meas_receive [bis


、I2C_tick (0]= 0x07

);发送[0_tick、I2C_tick (0]_tick);发送[0_tick (0_tick、tick);发送[0_tick_tick_0_tick (0_tick_tick_0]+[0]+[0]_





I2C_WRITE_READ (&transmit [0]、1、&Meas 接收[0]、3、addr);
//I2C_WRITE (&transmit [0]、1、addr);
//I2C_READ (&Meas 接收[0]、2、addr);

//I2C_READMode ();
//I2C_TempRead (;
//
while (1)
{
_DELAY_CYCLES (2000);
while (UCB0CTL1 & UCTXSTP); //确保发送了停止条件
UCB0CTL1 |= UCTXSTT; // I2C 启动条件

_bis_SR_register (LPM0_bits|GIE);//输入 LPM0、带中断
}
}



#if defined (__TI_Compiler_version__)|| defined (__IAR_systems_icc_)
#pragma vector = USCI_B0_vector
__interrupt void USCIB0_ISR (void)
#elif defined (__GCUN__)
void __attribute__((interrupt (USCI_B0_vector)#interrupt

) USCIB0_ISR (void)(void USCIB0!)编译器错误!
#endif
{
switch (__even_in_range (UCB0IV、USCI_I2C_UCBIT9IFG))
}
USCI_NONE 案例: 中断; //向量0:无中断
USCI_I2C_UCALIFG 案例:中断; //向量2:ALIFG
USCI_I2C_UCNACKIFG 案例: //向量4:NACKIFG
UCB0CTL1 |= UCTXSTT; //重新发送 START I2C START 条件
中断;
案例 USCI_I2C_UCSTTIFG:中断; //向量6:STTIFG
USCI_I2C_UCSTPIFG 案例: //向量8:STPIFG
TXData = 0;
UCB0IFG &=~UCSTPIFG; //清除停止条件 int 标志
中断;
USCI_I2C_UCRXIFG3案例:中断; //向量10:RXIFG3
USCI_I2C_UCTXIFG3案例:中断; //向量14:TXIFG3
USCI_I2C_UCRXIFG2案例:中断; //向量16:RXIFG2
USCI_I2C_UCTXIFG2案例:中断; //向量18:TXIFG2
USCI_I2C_UCRXIFG1案例:中断; //向量20:RXIFG1
USCI_I2C_UCTXIFG1案例: //向量22:TXIFG1
// UCB0TXBUF = TXData++;
中断;
USCI_I2C_UCRXIFG0案例: //向量24:RXIFG0
RXData = UCB0RXBUF; //获取 RX 数据
_BIC_SR_REGISTER_ON_EXIT (LPM0_BITS);//退出 LPM0
中断;
案例 USCI_I2C_UCTXIFG0:中断; //向量26:TXIFG0
案例 USCI_I2C_UCBCNTIFG:break; //向量28:BCNTIFG
USCI_I2C_UCCLTOIFG 案例:中断; //向量30:时钟低电平超时
USCI_I2C_UCBIT9IFG 案例:中断; //向量32:第9位
默认值:break;
}


void Stop_WD (void)
{
WDTCTL = WDTPW | WDTHOLD; //停止 WDT
}
//

//////////// void Device_ID (uint8_t device_reg)
//{
//
}
//
//////////////// void manufacturer_ID (uint8_t manufacturer_reg)
////

//////

//// void Ambient Temp (uint8_t Ambient_temp_reg)
//





uint16_t I2C_readMode (void)
{
uint8_t UpperByte = 0;
uint8_t LowerByte = 0;
uint16_t DATA = 0;

// UpperByte = iByte_Read ();//读取8位
///发送 NAACK 位
// Lower2c = iower2c_read ();// UpByte


= 8位

//数据返回8位;//数据返回

uint16_t I2C_TempRead (void)
{
uint8_t UpperByte = 0;
uint8_t LowerByte = 0;
uint16_t Temperature = 0;


//如果

((UpperByte & 0x80)= 0x80)
{、则转换温度数据//首次检查标志位 //TA ³ TCRIT
}
IF (((UpperByte & 0x40)= 0x40)
{ //TA > TUPPER
}
IF (((UpperByte & 0x20)= 0x20)
{ //TA < TLOWER
}
UpperByte = UpperByte & 0x1F; //清除标志位

if ((UpperByte & 0x10)=0x10)
{ //TA < 0°C
UpperByte = UpperByte & 0x0F; //清除符号
温度= 256 -(UpperByte * 16 + LowerByte / 16);
}
否则
{ //TA ³ 0°C
温度=(UpperByte * 16 + LowerByte / 16);
//温度=环境温度(°C)

返回温度;
}

void delay_tick (uint16_t tick)
{
for (uint16_t i=0)};<tick; i++); }



//-------------------------------- I2C ------------------------------------ //

void set_I2C (void)
{
P5SEL0 |= BIT2 | BIT3; // I2C 引脚
//为 I2C 模式配置 USCI_B0
UCB0CTLW0 |= UCSWRST; //软件复位使能
UCB0CTLW0 |= UCMODE_3 | UCMST | UCSYNC;// I2C 模式、主控模式、SYNC
UCB0CTLW1 |= UCASTP_2; //自动停止生成

的 UCB0BRW = 0x0008; //波特率= SMCLK / 8
UCB0TBCNT = 0x07; //要接收的字节数
UCB0I2CSA = 0x18; //从器件地址为0x18
UCB0CTL1 &=~UCSWRST;
UCB0IE |= UCRXIE | UCNACKIE | UCBCNTIE;


}



//------ I2C_Master_write------------------ //

uint32_t I2C_write (unsigned char* tx、uint32_t tlen、uint8_t addr)

{
uint32_t r_val = 0;

UCB0I2CSA = addr; // Asing slave address

while ((UCB0IFG 和 UCSTPIFG)); //检查
UCB0CTL1上的停止条件是否|= UCTR + UCTXSTT; //通过 I2C 同时开始写入
(!(UCB0IFG & UCTXIFG); //等待 TX 缓冲区就绪
(uint32_t i = 0;i < tlen;i++)
{
UCB0TXBUF =*((uint8_t*) TX + I); //在 I2C 的 TX 缓冲区中写入字符串
while (!(UCB0IFG & UCTXIFG)); //等待 TX 缓冲区就绪
if (i == tlen -1)
{ //如果只剩一个字节可写
UCB0CTL1 |= UCTXSTP; // I2C 停止条件
UCB0IFG &=~UCTXIFG; //清除 USCI_B0 TX int 标志
}
R_val++; //递增返回值
}

返回 r_val;
}//---------------

I2C_MASTER_READ------------------ //

uint32_t I2C_read (unsigned char* rx、uint32_t rlen、uint8_t addr)

{
UCB0IFG &&~UCSTPIFG;
uint32_t r_val = 0;

UCB0I2CSA = addr; //如果
(rlen!= 0)
{
while ((UCB0CTL1 & UCTXSTP)); //检查停止条件是否打开
UCB0CTL1 &=~UCTR; //将寄存器中的写入位设置为0
UCB0CTL1 |= UCTXSTT; //开始通过 I2C 读取
while (!(UCB0CTL1 & UCTXSTT)); //起始条件未发送
//只有一个字节
如果(rlen = 1)
{
while (!(UCB0IFG 和 UCRXIFG)) //等待开始条件被发送
{
if (((UCB0CTL1 & UCTXSTT)=0)
UCB0CTL1 |= UCTXSTP; //生成停止条件
}
while (UCB0CTL1 & UCTXSTP); //确保发送了停止条件
*((uint8_t*) rx)= UCB0RXBUF;
返回1;
}
//多个字节
for (uint8_t i = 0;i < rlen-1;i++)
{
while (!(UCB0IFG & UCRXIFG)); //等待新数据被写入 RX 缓冲区
*((uint8_t*) rx + i)= UCB0RXBUF; //读取 RX 缓冲区
R_val ++; //递增返回值
}
UCB0CTL1 |= UCTXSTP; //生成停止条件
while (UCB0CTL1 & UCTXSTP); //等待直到其生成
*((uint8_t*) rx+rlen-1)= UCB0RXBUF; //读取最后一个字节
}
返回 r_val++;
}

/******* /

uint32_t I2C_WRITE_READ (unsigned char* TX、uint32_t tlen、unsigned char* Rx、uint32_t rlen、uint8_t addr)
{

uint32_t r_val = 0;

UCB0I2CSA = addr; // Asing slave address

while ((UCB0IFG 和 UCSTPIFG)); //检查
UCB0CTL1上的停止条件是否|= UCTR + UCTXSTT; //通过 I2C 同时开始写入
(!(UCB0IFG & UCTXIFG); //等待 TX 缓冲区就绪
(uint32_t i = 0;i < tlen;i++)
{
UCB0TXBUF =*((uint8_t*) TX + I); //在 I2C 的 TX 缓冲区中写入字符串
while (!(UCB0IFG & UCTXIFG)); //等待 TX 缓冲区就绪
if (i == tlen -1)
{ //如果只剩一个字节可写
UCB0CTL1 |= UCTXSTP; // I2C 停止条件
UCB0IFG &=~UCTXIFG; //清除 USCI_B0 TX int 标志
}
R_val++; //递增返回值
}

r_val = 0;

如果(rlen!= 0)
{
while ((UCB0CTL1 & UCTXSTP)); //检查停止条件是否打开
UCB0CTL1 &=~UCTR; //将寄存器中的写入位设置为0
UCB0CTL1 |= UCTXSTT; //开始通过 I2C 读取
while (!(UCB0CTL1 & UCTXSTT)); //起始条件未发送
//只有一个字节
如果(rlen = 1)
{
while (!(UCB0IFG 和 UCRXIFG)) //等待开始条件被发送
{
if (((UCB0CTL1 & UCTXSTT)=0)
UCB0CTL1 |= UCTXSTP; //生成停止条件
}
while (UCB0CTL1 & UCTXSTP); //确保发送了停止条件
*((uint8_t*) rx)= UCB0RXBUF;
返回1;
}
//多个字节
for (uint8_t i = 0;i < rlen-1;i++)
{
while (!(UCB0IFG & UCRXIFG)); //等待新数据被写入 RX 缓冲区
*((uint8_t*) rx + i)= UCB0RXBUF; //读取 RX 缓冲区
R_val ++; //递增返回值
}
UCB0CTL1 |= UCTXSTP; //生成停止条件
while (UCB0CTL1 & UCTXSTP); //等待直到其生成
*((uint8_t*) rx+rlen-1)= UCB0RXBUF; //读取最后一个字节
}

返回 r_val++;
}

谢谢!

谢蒂先生

学生

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Shetty 先生、您好!
    请先让我仔细检查一下、我是否理解了您提供的数据是否正确。
    因此、我对图的理解是、第一个图显示了您传输到 MCP 设备的内容、根据您的帖子与 MCP 数据表中写入的内容匹配的内容。
    第二个图显示在第二个数据块中 MCP 设备的响应、 根据您的判断、根据逻辑分析仪的快照、应该是(0x31)、(0x00)、(0x08)、但实际上是(0x31)(0x00)(0x18)(0x01)(0xFF)(0xFF)、这也是您在 MSP430侧看到的结果。
    这是正确的理解吗?

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

    是的,您已正确理解。

    此致、
    Rajat Shetty
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Shetty 先生、您好!
    在本例中、这是一个好消息和一个坏消息。
    好消息是、这意味着 MSP430 I2C 正在发送和接收它应该接收的内容、这意味着 MSP430 I2C 正在正常工作、但 Microchip 器件没有按应有的方式响应。

    在本例中、我有两个意见:
    1.如果 MCP9808表示 Microchip 器件未按预期响应、则需要获得 Microchip 的支持。
    2.当然,我已经看了 MCP9808的作用,发现它是一个温度传感器。 查看分销商的定价、它仅需1个样片1欧元。 现在、我不确定您是否知道、我们所有配备 ADC 的 MSP430器件都支持使用集成温度传感器进行温度测量、包括闪存或 FRAM 存储器中出厂时的校准值。 一方面、MSP430FR4133及其 ADC 就是这种情况、但即使您说、您需要远程放置温度感应器件、例如、MSP430FR2100可以以大约一半的微芯片器件1个样本的成本完成工作。

    因此、您可能应该重新考虑整个问题。

    遇到 MSP430相关问题后、您当然可以随时返回我们寻求支持。 非常感谢您的理解。

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

    您好、Peter、

    感谢您的回答。

    此致、

    Rajat Shetty