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