主题中讨论的其他器件: MSP430FR2355、 TPS22860、 TPS780
工具/软件:Code Composer Studio
您好!
我们的电路板上的 I2C 总线有一个奇怪的问题。
我们在其他组件中使用:
MSP430FR2155
在 I2C 上:两个 EEPROM STM M24512、一个加速计 Kionix KX122-1037
上拉、4、7k Ω、上拉电阻提供给控制器、而不是直接从 Vcc、
在没有组件的 PCB 上测得的总线电容 SDA 接地4、1pf、SCL 接地4、0pF、SDA 接地3、5pf
导线长度小于40mm
我们生产50块电路板、在28块电路板上生产代码卡在第一个 I2C 通信中。 我们发现控制器没有将 SDA 下拉至 GND、没有释放起始条件。
在其中一些电路板上、我们移除加速计、然后代码运行。
然后、我们在其中一个故障电路板上刷写了 TI 的示例代码。 此外、使用此代码、没有释放起始条件。 SDA 和 SCL 都保持在3.3V。
在调试期间、我们注意到、当我们设置一些断点时、代码会起作用。 最后、我们包括一个延迟环路。 但由于延迟、它可以正常工作、而不是。
您有什么想法电路板上可能会出现什么问题吗?
TI 的示例代码经过细微修改、将 P2.4设置为高电平以提供上拉电阻、并从端口0更改为1
*--/版权--*/
//
// MSP430FR235x 演示- eUSCI_B0 I2C 主器件 TX 字节到多个从器件
//
//说明:此演示通过 I2C 总线连接两个 MSP430。
//主器件发送到4个不同的 I2C 从器件地址0x0A、0x0B、0x0C&0x0D。
//每个从地址在数组 TXData[]中都有一个特定的相关数据。
//在四个 I2C 事务结束时,从器件地址回滚并开始
//再次位于0x0A。
// ACLK = REFO = 32768Hz、MCLK = SMCLK =默认 DCO =~1MHz
//与 msp430fr235x_uscib0_i2c_16.c 一起使用
//
// /|\/|\
// MSP430FR2355 10k MSP430FR2355
// 从 器件| | 主器件
// ------------ | ||---
// | P1.2/UCB0SDA|-|-|-|-||P1.2/UCB0SDA |
// | || | |
// | || | |
// | P1.3/UCB.S.|-|-|--- |P1.3/UCB.S. |
// | || |
//
// 现金 Hao
// Texas Instruments Inc.
// 2016年11月
// 使用 IAR Embedded Workbench v6.50.0和 Code Composer Studio v6.2.0构建
//
#include
unsigned char TXData[]={0xA1、0xB1、0xC1、0xD1}; //指向 TX 数据的指针
unsigned char SlaveAddress[]={0x0A、0x0B、0x0C、0x0D};
unsigned char TXByteCtr;
unsigned char SlaveFlag = 0;
int main (空)
{
WDTCTL = WDTPW | WDTHOLD; //停止看门狗计时器
//为 I2C 配置引脚
P4SEL0 |= BIT7 | BIT6; // I2C 引脚
P2SEL0 &=~BIT4; // I2C 电源引脚
P2SEL1 &=~BIT4; // I2C 电源引脚
P2DIR |= BIT4; // I2C 电源引脚
P2OUT |= BIT4; // I2C 电源引脚
//禁用 GPIO 上电默认高阻抗模式
//激活先前配置的端口设置
PM5CTL0 &=~LOCKLPM5;
//将 USCI_B0配置为 I2C 模式
UCB1CTLW0 |= UCSWRST; //将 eUSCI_B 置于复位状态
_DELAY_CYCLES (50000); //附加延迟
UCB1CTLW0 |= UCMODE_3 | UCMST; // I2C 主控模式、SMCLK
UCB1BRW = 0x8; //波特率= SMCLK / 8
UCB1CTLW0 &=~ UCSWRST; //清除复位寄存器
UCB1IE |= UCTXIE0 | UCNACKIE; //发送和 NACK 中断使能
SlaveFlag =0;
while (1)
{
__DELAY_CYCLES (1000); //传输之间的延迟
UCB1I2CSA = SlaveAddress[SlaveFlag]; //配置从地址
TXByteCtr = 1; //加载 TX 字节计数器
while (UCB1CTLW0和 UCTXSTP); //确保发送了 STOP 条件
UCB1CTLW0 |= UCTR | UCTXSTT; // I2C TX,启动条件
_bis_SR_register (LPM0_bits | GIE); //输入 LPM0、带中断
//保持在 LPM0中直到所有数据
//是 TX
//更改从机地址
SlaveFlag++;
if (SlaveFlag>3) //翻转从地址
{
SlaveFlag =0;
}
}
}
#if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
#pragma vector = USCI_B1_Vector
_interrupt void USCIB1_ISR (void)
#Elif defined (_GNU_)
void __attribute__((中断(USCI_B1_vector)) USCIB1_ISR (void)
其他
错误编译器不受支持!
#endif
{
开关(__evo_in_range (UCB1IV、USCI_I2C_UCBIT9IFG))
{
案例 USCI_NONE:break; //向量0:无中断中断;
USCI_I2C_UCALIFG 案例:中断;
USCI_I2C_UCNACKIFG 案例:
UCB1CTL1 |= UCTXSTT; //如果 NACK,则重新发送开始
中断; //向量4:NACKIFG 中断;
case USCI_I2C_UCSTTIFG:break; //向量6:STTIFG break;
案例 USCI_I2C_UCSTPIFG:中断; //矢量8:STPIFG 中断;
案例 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中断;
案例 USCI_I2C_UCRXIFG0:中断; //向量24:RXIFG0中断;
USCI_I2C_UCTXIFG0案例:
if (TXByteCtr) //检查 TX 字节计数器
{
UCB1TXBUF = TXData[SlaveFlag]; //加载 TX 缓冲区
TXByteCtr -; //减量 TX 字节计数器
}
其他
{
UCB1CTLW0 |= UCTXSTP; // I2C 停止条件
UCB1IFG &=~UCTXIFG; //清除 USCI_B0 TX 内部标志
_BIC_SR_REGISTER_ON_EXIT (LPM0_BITS); //退出 LPM0
}
中断; //向量26:TXIFG0中断;
案例 USCI_I2C_UCBCNTIFG:break; //向量28:BCNTIFG
案例 USCI_I2C_UCCLTOIFG:中断; //矢量30:时钟低电平超时
案例 USCI_I2C_UCBIT9IFG:中断; //向量32:第9位
默认值:break;
}
}