大家好,我目前有一个MSP430蓝线连接到AFE4404EVM,如下方框图所示。
目前,我一直在尝试使用I2C通信与AFE4404,但我根本没有收到任何响应。 蓝线接线后,计算机无法识别AFE4404EVM,并且插入电源后外部传感器不会亮起。
调试此问题的步骤如下:
已将AFE4404插入计算机-根本无法识别它;它未显示在设备管理器中,并且LED1是唯一亮起的设备。 外部传感器根本不亮。 已在多台计算机上对其进行了测试。
我的队友Victoria为AFE4404电路板探测了可能是由于焊接和脱焊而发生的短路,但她没有发现任何短路。
我已确保AFE_RESETZ始终设置为高。
我已检查ADC_RDY引脚是否为高电平,但它根本不会为高电平。
对于I2C:
在我的测试期间,我能够从MSPEXP430G2553LP获得以下I2C波形:
我已经看到I2C协议满足了启动和停止条件。
我正在使用的代码是MSP430 MCU之间I2C示例之一的修改版本。 它演示了通过I2C传输和接收位。 当我逐步浏览修改后的代码时,它能够传输我希望它发送的位,但它不会从AFE收到任何位。 我修改了代码,写入第九和第十个寄存器,尝试打开LED2,但没有发生任何事情。 我不确定我是否正确处理了它,并且我附上了我所使用的代码的当前版本。 另一件事是我们使用的GND与MCU蓝线文档中的接地不同,电阻器为11k,因为在测试期间没有任何10k电阻器可用。 我还附上了用于测试的代码的当前版本的zip文件。
下面,我附上了一份示例副本,我修改了该示例以获得上面显示的第一个波形。 我是否采用了正确的方法来尝试从AFE4404EVM上的特定寄存器获取数据? 我已经检查了数据表并找到了定时寄存器,但我不确定我需要写什么来打开LED,例如,或从特定寄存器读取信息。
/*--版权--,BSD_EX
*版权所有(c) 2012,Texas Instruments Incorporated
*保留所有权利。
*
**
允许以源代码和二进制格式重新发布和使用,无论是否进行*修改,只要
满足以下条件*:
*
****重新发布源代码必须保留上述版权
*声明,此条件列表和以下免责声明。
*
***以二进制格式重新分发时,必须在
随分发提供的*文档和/或其他材料中复制上述版权*声明,此条件列表和以下免责声明。
*
***
未经事先书面许可,不得使用德州仪器(TI)公司的名称或*其贡献者的名称来支持或促销由本软件衍生的产品*。
*
*本软件由版权所有者和贡献者"按原样"提供
*,
不提供任何明示或暗示的担保,包括但不限于*对适销性和特定*用途适用性的暗示担保。 在任何情况下,版权所有者或
*贡献者均不对任何直接,间接,附带,特殊,
*示范, 或后果性损害(包括但不限于
*购买替代商品或服务;使用,数据或利润损失;
(*或业务中断),但根据任何责任理论
,*无论是合同,严格责任还是侵权行为(包括疏忽或
*其他),均因使用本软件而导致*
,即使已被告知此类损害的可能性。
*
******************
*
** MSP430代码示例免责声明
*
MSP430代码示例是独立的低级程序
,通常*以高度
*简洁的方式演示单个外设功能或器件功能。 因此,代码可能依赖于设备的开机默认
值*寄存器值和设置(如时钟配置),
在合并多个示例中的代码时必须*小心,以避免潜在的副作用
*。 另请参阅www.ti.com/grace了解GUI,并参阅www.ti.com/msp430ware
*了解外围设备配置的API功能库方法。
*
**--/copyright--*//************************************************************************************************************************
// MSP430G2xx3演示-来自MSP430从属
设备的USI_B0 I2C主TX/RX多字节// 在TX和RX操作之间重复启动。
////
说明:此演示通过I2C总线连接两个MSP430。 主
//传输到从属设备,然后生成重复启动,接着
是//接收操作。 这是主代码。 此代码演示了如何
//使用USI_B0 TX
//中断对USCI模块执行I2C重复启动。
// aclk = n/a,MCLK = SMCLK = BRCLK =默认DCO =~1.2MHz
//
// ***与msp430x22x4_uscib0_i2c_13.c***
//一起使用
/|\/|\
// MSP430F24x 10公里10公里 MSP430G2xxS 3
// 从属 || 母版
// -------- ||--------------------
// -|XIN WFP 3.1 /UCB0SDA|<-|---++->|WFP MODUPE/UCB0SDA 3.1 XIN|-//
| || | |//
-|XOUT || | XOUT|-
// | WFP 3.2 / UCB.S.|<-++--- >>|WFP 3.2 / UCB.S. |//
| | | |////
D. Dang
//德州仪器(TI)
// 2011年2月
//使用CCS版本4.2 0和IAR嵌入式工作台版本:5.10
//**************************************************************************************
#include <MSP4S.h>
#define NUM_bytes_TX 3 //有多少字节?
#define NUM_Bytes_RX 3
int RXByteCtr,RPT_Flag = 0; //在1
个volatile unsigned char RxBuffer[128]时启用重复启动; //分配128字节的RAM
unsigned char *PTxData; //指向TX数据
的指针unsigned char *PRxData; //指向RX data
unsigned char TXByteCtr的指针,RX = 0;
const unsigned char TxData[]= //要传输
的数据表{
0x00,
0x01,
0x09,//LED2 Start
0x0F//,//LED2是否打开?
//0x0A,// LED2结束 //取消注释这会阻止通信循环
//0x0F // LED2关闭?
};
void Setup_TX(void);
void Setup_RX(void);
void transmit(void);
void receive (void);
INT MAIN (void)
{
WDTCTL = WDTPW + WDTHOLD; //停止WDT
P1DIR |= BIT4; // WFP 1.4 输出
P1SEL || BIT6 + BIT7; //将I2C引脚分配给USI_B0
P1SEL2|= BIT6 + BIT7; //将I2C引脚分配给USI_B0
P1OUT |= 0x01; //WFP 1.4 =1表示AFE_RESETZ
而(1){
//传输过程
Setup_TX();
RPT_Flag = 1;
Transmit();
while (UCB0CTL1和UCTXSTP); //确保停止条件已发送
//接收进程
Setup_Rx();
receive();
while (UCB0CTL1 & UCTXSTP); //确保已发送停止条件
}//------------------
// USI_B0数据ISR用于将接收到的数据从I2C从
//移动到MSP430存储器。 它的结构使其可以通过
预加载带字节计数的RXByteCtr来接收//任意2+个字节。
//------------------
#IF Defined (__TI_Compiler_version__)|| defined (__IAR_SYSTEMS _ICC__)
#pragma vector = USCIAB0TX_vector
__interrupt void USCIAB0TX_ISR(void)
#Elif defined(__GNU_)
void __attribute__(interrupt (USCIAB0TX_ISR_error
)不支持)#SCIAB0TX)
#endif
{
IF (RX == 1){ //主中继器接收?
RXByteCtr --; // Decrement RX字节计数
器IF (RXByteCtr)
{
*PRxData++= UCB0RXBUF; //将RX数据移动到地址PRxData
}
,否则
{
IF (RPT_Flag == 0)
UCB0CTL1 || UCTXSTP; //不重复启动:停止条件
IF (RPT_Flag == 1){ //如果重复启动:不执行任何操作
RPT_Flag = 0;
}
*PRxData = UCB0RXBUF; //将最终RX数据移至PRxData
__BIC_SR_REGISTER_ON_EXIT (CPUOFF); //退出LPM0
}}
否则{ //主传输
IF (TXByteCtr) //检查TX字节计数
器{
UCB0TXBUF =* PTxData++; //加载TX缓冲区
TXByteCtr // Decrement TX字节计数
器}
其他
{
IF (RPT_Flag == 1){
RPT_Flag = 0;
PTxData =(unsigned char *)TxData; // TX阵列起始地址
TXByteCtr = TxData的大小; //加载TX字节计数器
__BIC_SR_REGISTER_ON_EXIT (CPUOFF);
}
否则{
UCB0CTL1 || UCTXSTP; // I2C停止条件
IFG2 &=~UCB0TXIFG; //清除USI_B0 TX int标志
__BIC_SR_REGISTER_ON_EXIT (CPUOFF); //退出LPM0
}
}
}
}}
void Setup_TX(void){
__disable_interrupt();
BCSCTL1 = CALC1_8MHZ; //将时钟速度设置为8MHz
DCOCTL = CALDCO_8MHZ;
RX = 0;
IE2 &=~UCB0RXIE;
while (UCB0CTL1和UCTXSTP); //确保停止条件已发送//禁用RX中断
UCB0CTL1 || UCSWRST; //启用软件重置
UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC; // I2C主控,同步模式
UCB0CTL1 = UCSSEL_2 + UCSSWRST; //使用SMCLK,保持软件重置
UCB0BR0 =1; //将时钟设置为8MHz (9800波特
) UCB0BR1 =0; //将时钟设置为8MHz (9800波特)
// UCB0BR0 =12; // fSCL = SMCLK/12 =~100kHz
// UCB0BR1 = 0;
UCB0I2CSA = 0x58; //从属地址为058h
UCB0CTL1 &=~UCSWRST; //清除软件重置,恢复操作
IE2 |= UCB0TXIE; //启用TX中断
}
void Setup_RX(void){__disable_interrupt()
;
BCSCTL1 = CALC1_8MHZ; //将时钟速度设置为8MHz
DCOCTL = CALDCO_8MHZ;
RX = 1;
IE2 &=~UCB0TXIE;
UCB0CTL1 |= UCSWRST; //启用软件重置
UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC; // I2C主控,同步模式
UCB0CTL1 = UCSSEL_2 + UCSSWRST; //使用SMCLK,保持软件重置
UCB0BR0 =1; //将时钟设置为8MHz (9800波特
) UCB0BR1 =0; //将时钟设置为8MHz (9800波特
) UCB0I2CSA = 0x58; //从属地址为058h
UCB0CTL1 &=~UCSWRST; //清除软件重置,恢复操作
IE2 |= UCB0RXIE; //启用RX中断
}
void Transmit(void){
PTxData =(unsigned char *)TxData; // TX阵列起始地址
TXByteCtr =大小TxData; //加载TX字节计数器
同时(UCB0CTL1和UCTXSTP); //确保停止条件已发送
UCB0CTL1 || UCTR + UCTXSTT; // I2C TX,启动条件
__bis_sr_register (CPUOFF + GIE); //输入LPM0 w/ interrupts
}
void receive (void){
PRxData =(unsigned char *)RxBuffer;// RX缓冲区的开始
RXByteCtr = NUM_Bytes_RX-1; //加载RX字节计数器
同时(UCB0CTL1和UCTXSTP); //确保停止条件已发送
UCB0CTL1 || UCTXSTT; // I2C启动条件
__bis_sr_register (CPUOFF + GIE); //输入LPM0 w/ interrupts
}
谢谢!
Victor B


