Hi, All !Happy New Year!
在调试MSP430G2553的I2C外设读取ADT7410的CHIP ID时,结果不正确。怀疑是配置错误或配置的顺序不正确。困扰很久了,我需要帮助。
芯片:MSP430G2553
IDE:CCS V7.4
ADT7410是一个2C接口温度传感芯片,同MSP430一样,支持低功耗特性,但在调试期间,我先不考虑能耗优化,先用I2C读取到Chip ID,再做软件设计。ADT7410的设备地址是0x4B,我已经访问到了。Chip ID的寄存器地址是0x0B,Chip ID的是11001XXX(MSB),后三位是芯片版本号,不固定。用我写的代码读取的值是0x0C,也就是说,我读错了。原代码和调试结果如下,请各位工程师帮忙看一眼,看看错在哪了,谢谢!
#include <msp430.h> #include "msp430g2553.h" #include "12864_3xian.h"//Function delay1000(DELAY) in this file #define DELAY 2 void LED2_ON(void); void LED3_ON(void); void LED2_OFF(void); void LED3_OFF(void); int main(void) { WDTCTL = WDTPW + WDTHOLD; // Stop Watchdog Timer P1SEL |= BIT6 + BIT7; // Assign I2C pins to USCI_B0 P1SEL2|= BIT6 + BIT7; // Assign I2C pins to USCI_B0 P3DIR |=BIT2+BIT3;//BIT2 BIT3 is LED on Board UCB0CTL1 |= UCSWRST; // Enable SW reset UCB0CTL0 = UCMST+UCMODE_3+UCSYNC; // I2C Master, synchronous mode UCB0CTL1 = UCSSEL_2+UCSWRST; // Use SMCLK, keep SW reset UCB0BR0 = 12; // fSCL = SMCLK/12 = ~100kHz UCB0BR1 = 0; UCB0I2CSA = 0x4B; // ADT7410 I2C address is 0x4B UCB0CTL1 &= ~UCSWRST; // Clear SW reset, resume operation unsigned int temp; while (1) { UCB0CTL1 |= UCTR;//设置为发送模式 delay1000(DELAY); UCB0CTL1 |= UCTXSTT;//先产生起始条件 UCB0TXBUF = 0x0B;//再往BUF中写入待发送的数据。ADT7410的Chip ID地址是0x0B while (UCB0CTL1 & UCTXSTT);//数据发送完成后,UCTXSTT会被置0。即等待直到发送完成。 UCB0CTL1 |= UCTXSTP;//完成后往总线发送停止条件,结束本次写操作 //After write ,blanking LED for easy debug LED2_ON(); delay1000(DELAY); LED2_OFF(); delay1000(DELAY); UCB0CTL1 &= ~UCTR;//设置为接收模式 delay1000(DELAY); UCB0CTL1 |= UCTXSTT;//先产生起始条件 while(UCB0CTL1 & UCTXSTT)//等待ADT7410的ACK temp = UCB0RXBUF;//读取缓冲区 UCB0CTL1 |= UCTXSTP;//完成后往总线发送停止条件,结束本次读操作 delay1000(DELAY); } } void LED2_ON(void) { P3OUT |=BIT2; } void LED3_ON(void) { P3OUT |=BIT3; } void LED2_OFF(void) { P3OUT &=~BIT2; } void LED3_OFF(void) { P3OUT &=~BIT3;