主题中讨论的其他器件: TCA9548A、 MSP430WARE
工具/软件:Code Composer Studio
您好,
我们使用的是一个 zcu111 Xilinx 关联板。该板具有系统控制器 MCU MSP430F5342。Ther 是 来自 TI 的 I2C 多路复用器(tca9548a)、 我正在尝试通过 MSP430F5342对其进行编程。我正在尝试启用此 i2c 多路复用器中的通道1 。为此,我仅通过修改从地址来获取由 ti (MSP430F534x_uscib0_i2c_10.c)提供的一个主接收器示例 i2c 代码。 tca9548a 的地址为0x74。根据数据表,它只有一个控制寄存器,可以通过为从机地址提供设置的读取位来读取该寄存器。 我正在尝试读取控制寄存器、但无法读取
我看到一些文章说要将从器件地址右移1位,因为 USCI 模块会自动将它向左移1位来获取它。 我没有得到这一点,但仍然尝试使用2个地址 0x74和0x3A (通过右移0x74)。 我所面临的问题是 UCRXIFG 根本没有设置、ISR 也没有执行 、所以我无法读取 UCB0RXBUF。 我在这里附上了我的代码。是否有人可以解释问题是什么,哪里出了问题,需要移动从地址?
我在将 MSP430配置为主发送器时也遇到了同样的问题。 当我尝试向 UCB0TXBUF 发送 TX 数据 时,不确认 (UCNACKIFG)标志总是高电平。
#include
unsigned char * PRxData;//指向 RX 数据的指针
unsigned char RXByteCtr;
volatile unsigned char RxBuffer[128];//分配128字节的 RAM
int main (空)
{
WDTCTL = WDTPW + WDTHOLD; //停止 WDT
P3SEL |= 0x03; //将 I2C 引脚分配给 USCI_B0
UCB0CTL1 |= UCSWRST; //启用 SW 复位
UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC; // I2C 主设备,同步模式
UCB0CTL1 = UCSSEL_2 + UCSWRST; //使用 SMCLK、保持软件复位
UCB0BR0 = 12;// fSCL = SMCLK/12 =~100kHz
UCB0BR1 = 0;
UCB0I2CSA = 0x74;//从地址
// UCB0I2CSA = 0x3A;
UCB0CTL1 &=~UCSWRST;//清除 SW 复位,恢复运行
UCB0IE |= UCRXIE;//启用 RX 中断
while (1)
{
PRxData =(unsigned char *) RxBuffer; // RX 缓冲区的开始
RXByteCtr = 1; //加载 RX 字节计数器
while (UCB0CTL1 & UCTXSTP); //确保发送了停止条件
UCB0CTL1 |= UCTXSTT; // I2C 启动条件
_bis_SR_register (LPM0_bits + GIE); //输入 LPM0,启用中断
//保持在 LPM0中直到所有数据 A
//是 RX
__no_operation(); //在此处设置断点<<和
} //读取 RxBuffer 缓冲区
}
///----------------------------------
// USCI_B0数据 ISR 用于移动从 I2C 从设备接收到的数据
//到 MSP430内存。 它的结构使其可用于接收
//通过预加载 RXByteCtr 并进行字节计数,可获得任意2+个字节。
///----------------------------------
#if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
#pragma vector = USCI_B0_vector
_interrupt void USCI_B0_ISR (void)
#Elif defined (_GNU_)
void __attribute__((中断(USCI_B0_vector)) USCI_B0_ISR (void)
其他
错误编译器不受支持!
#endif
{
switch (__evo_in_range (UCB0IV、12))
{
情况0:中断; //向量0:无中断
案例2:中断; //向量2:ALIFG
案例4:中断; //向量4:NACKIFG
案例6:中断; //向量6:STTIFG
案例8:中断; //向量8:STPIFG
案例10: //向量10:RXIFG
RXByteCtr --; //递减 RX 字节计数器
IF (RXByteCtr)
{
* PRxData++= UCB0RXBUF; //将 RX 数据移动到地址 PRxData
IF (RXByteCtr = 1) //只剩下一个字节?
UCB0CTL1 |= UCTXSTP; //生成 I2C 停止条件
}
其他
{
* PRxData = UCB0RXBUF; //将最终 RX 数据移动到 PRxData
_BIC_SR_REGISTER_ON_EXIT (LPM0_BITS); //退出活动 CPU
}
中断;
情况12:中断;//向量12:TXIFG
默认值:break;
}
}
此致、
Soumya