This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430F4152:控制器引脚上不会生成 SDA 和 SCL 等 I2C 信号

Guru**** 2378650 points
Other Parts Discussed in Thread: MSP430F4152
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/994778/msp430f4152-i2c-signals-like-sda-and-scl-are-not-generated-on-the-controller-pins

器件型号:MSP430F4152

我已经下载了一个用于 MSP430F4152控制器 i2c 通信的演示代码

我有32.768kHz 外部晶振、而4.7K 上拉电阻器连接到 SDA 和 SCL 线路

我检查了引脚1和2上的信号、但在 SCL 和 SDA 上没有显示任何脉冲  

请检查代码

内部 TXByteCtr;
unsigned char PRxData;
INT Rx = 0;
CHAR WHO _AM_I = 0x00;

unsigned char itgAddress = 0xA0;

void init_I2C (void);
void transmit (void);
接收无效(无效);


int main (空)

WDTCTL = WDTPW + WDTHOLD;//停止 WDT
WDTCTL = WDTPW + WDTHOLD;//停止 WDT
P6SEL |= BIT1+BIT2;//将 I2C 引脚分配给 USCI_B0
//P1SEL |= BIT6 + BIT7;//将 I2C 引脚分配给 USCI_B0
//P1SEL2|= BIT6 + BIT7;//将 I2C 引脚分配给 USCI_B0
init_i2C();


while (1)

//传输过程
RX = 0;
TXByteCtr = 1;
Transmit ();
//接收过程
RX = 1;
receive();

///----------------------------------
// USCI_B0数据 ISR 用于移动从 I2C 从设备接收到的数据
//到 MSP430内存。 它的结构使其可用于接收
///----------------------------------
#pragma vector = USCIAB0TX_vector
_interrupt void USCIAB0TX_ISR (void)

if (Rx = 1)
{//主接收?
PRxData = UCB0RXBUF;//获取 RX 数据
_BIC_SR_REGISTER_ON_EXIT (CPUOFF);//退出 LPM0

其他
{//主机发送
if (TXByteCtr)//检查 TX 字节计数器

UCB0TXBUF =世卫组织_AM_I;//加载 TX 缓冲器
TXByteCtr -;//减量 TX 字节计数器

其他

UCB0CTL1 |= UCTXSTP;// I2C 停止条件
IFG2 &=~UCB0TXIFG;//清除 USCI_B0 TX 内部标志
_BIC_SR_REGISTER_ON_EXIT (CPUOFF);//退出 LPM0


void init_I2C (void){
UCB0CTL1 |= UCSWRST;//启用 SW 复位
UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC;// I2C 主器件、同步模式
UCB0CTL1 = UCSSEL_2 + UCSWRST;//使用 SMCLK、保持软件复位
UCB0BR0 = 1;// fSCL = SMCLK/12 =~100kHz
UCB0BR1 = 0;
UCB0I2CSA = itgAddress;//从器件地址为069h
UCB0CTL1 &=~UCSWRST;//清除 SW 复位,恢复运行
IE2 |= UCB0RXIE + UCB0TXIE;//启用 RX 和 TX 中断

void transmit (void){
while (UCB0CTL1 & UCTXSTP);//确保发送了 STOP 条件
UCB0CTL1 |= UCTR + UCTXSTT;// I2C TX、启动条件
_bis_SR_register (CPUOFF + GIE);//输入 LPM0、带中断

void receive (void){
while (UCB0CTL1 & UCTXSTP);//确保发送了 STOP 条件
UCB0CTL1 &=~UCTR;//清除 UCTR
UCB0CTL1 |= UCTXSTT;// I2C 启动条件
while (UCB0CTL1 & UCTXSTT);//起始条件是否发送?
UCB0CTL1 |= UCTXSTP;// I2C 停止条件
_bis_SR_register (CPUOFF + GIE);//输入 LPM0、带中断

请指导我们完成研发工作、并进一步投入生产

此致、

Anushka

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    unsigned char itgAddress = 0xA0;

    I2C 地址仅为7位、因此我可以告诉您该地址不正确。 我的第一个猜测是正确的地址是(0xA0 >> 1)= 0x50。

    ----

    >UCB0BR0  = 1;// fSCL = SMCLK/12 =~100kHz

    这会以1MHz 的频率运行 I2C、MSP430不支持该频率。 尝试:

    >UCB0BR0 = 10;// fSCL = SMCLK/10 =~100kHz

    ----

    这两种情况都不适合您的症状、因为我希望您会看到一些活动、即使所有交易都会失败。 同样、我建议您修复这些问题、以便您可以看到下一步是什么。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我已 按照您的建议对代码进行了编辑。

     unsigned char itgAddress = 0x50;

     UCB0BR0 = 10;  

    但不会生成 SCL 和 SDA 的波形。

    以进一步检查是否  生成了 USCIAB0RX_VECTOR 中断

    我使用一个端口引脚来驱动 LED。

    在上电时、我打开 LED。

    在  USCIAB0RX_Vector 中断例程中切换 LED。

     

    当我运行程序时、LED 亮起、然后熄灭、没有发生任何情况

    此致、

    Anushka

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您是否正确地看到 SCL 和 SDA 上根本没有任何活动? 您看到了什么电压电平?

    如果 I2C 从器件将 SCL 保持在低电平("时钟拉伸")、MSP430将无法生成启动条件。

    ------------

    我在上面看不到 USCIAB0RX_VECTOR。 您使用哪些 IE 位来触发它?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是 的,SCL 和 SDA 引脚上根本没有任何活动。 这两个引脚都是引脚、并通过4.7K 上拉电阻器连接到 VCC。

    这两个引脚都具有3.2V 的电压

    在代码中、我启用了 Tx 中断  

    请参阅代码。

    需要代码中的任何内容。 似乎未启用 I2C 外设  


    unsigned char * PTxData;//指向 TX 数据的指针
    unsigned char TXByteCtr;
    const unsigned char TxData[]=//要发送的数据表

    0x11、
    0x22、
    0x33、
    0x44、
    0x55
    };

    int main (空)

    WDTCTL = WDTPW + WDTHOLD;//停止 WDT

    #if Add_backlight
    P6OUT = 0x00;
    P6DIR |= 0xff;

    P6DIR |= BIT1;//设置 P6.1输出方向
    P6DIR |= backlight_control;//设置 P6.7输出方向
    P6OUT ^=背光控制;
    #endif //
    P6SEL |= BIT1+BIT2;//将 I2C 引脚分配给 USCI_B0
    UCB0CTL1 |= UCSWRST;//启用 SW 复位
    UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC;// I2C 主器件、同步模式
    UCB0CTL1 = UCSSEL_2 + UCSWRST;//使用 SMCLK、保持软件复位
    UCB0BR0 = 10;// fSCL = SMCLK/11 = 95.3kHz
    UCB0BR1 = 0;
    UCB0I2CSA = 0x50;//从器件地址为048h
    UCB0I2CIE |= UCSTTIE;//START 条件中断使能
    UCB0CTL1 &=~UCSWRST;//清除 SW 复位,恢复运行
    IE2 |= UCB0TXIE;//启用 TX 中断

    while (1)

    PTxData =(unsigned char *) TxData;// TX 数组起始地址
    TXByteCtr = TxData 的大小;//加载 TX 字节计数器
    UCB0CTL1 |= UCTR + UCTXSTT;// I2C TX、启动条件
    _bis_SR_register (CPUOFF + GIE);//输入 LPM0、带中断
    //保持在 LPM0中直到所有数据
    //是 TX
    __no_operation();
    while (UCB0CTL1 & UCTXSTP);//循环直到 STP 被发送

    ///----------------------------------
    // USCIAB0TX_ISR 的结构使其可用于传输任何数据
    //预加载带有字节计数的 TXByteCtr 的字节数。 此外、TXData
    //指向要发送的下一个字节。
    ///----------------------------------
    #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_vector)) USCIAB0TX_ISR (void)
    其他
    错误编译器不受支持!
    #endif

    #if Add_backlight
    P6OUT ^=背光控制;
    #endif //
    if (TXByteCtr)//检查 TX 字节计数器

    UCB0TXBUF =* PTxData++;//加载 TX 缓冲区
    TXByteCtr -;//减量 TX 字节计数器

    其他

    UCB0CTL1 |= UCTXSTP;// I2C 停止条件
    IFG2 &=~UCB0TXIFG;//清除 USCI_B0 TX 内部标志
    _BIC_SR_REGISTER_ON_EXIT (CPUOFF);//退出 LPM0

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    今天我再次检查了。我发现 SDA 线路为低电平、并看到20usec 高到低电平脉冲、SDA 在 SDA 引脚上变为高电平、而在 SCL 引脚上保持高电平持续

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    UCB0I2CIE |= UCSTTIE;//启动条件中断使能

    这将导致调用 USCIAB0RX_VECTOR、但我在该代码中看不到一个、因此它将在 ISR_Trap 结束。

    您似乎不会使用这种方法、因此我建议您删除这一行。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我 删除了代码 UCB0I2CIE |= UCSTTIE

    但结果仍然相同、不会生成 SCL 和 SDA

    我可以在 SDA 上看到20微秒的脉冲、然后 SDA 变为高电平、SCL 持续为高电平

     

     

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Anushka:

    您能否从 Resource Explorer 中尝试此示例并确认其是否正常工作:

    https://dev.ti.com/tirex/explore/node?node=ADa7OW6O26g9z.bVHAb53A__IOGqZri__LATEST&search=msp430F4152

    BR、
    Leo