社区导航

 

搜索
查看: 1934|回复: 1

[MSP432] 有关MSP432的IIC模块的问题

[复制链接]

37

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2015-8-10 17:08 | 显示全部楼层 |阅读模式
本帖最后由 Ds_Sky 于 2015-8-10 17:21 编辑

这是我的代码:
  1. <blockquote>#include "msp.h"
复制代码
这段代码是TI官网提供的示例代码,我修改的部分只有红色部分,据我所知,这些改动是不会影响iic的正常运行的。
现在问题是:我用示波器检测SCL、SDA,SCL/SDA开启了内部上拉,但是没有接任何slave,即是悬空的。发现全速运行时,模块发送了起始信号之后,并没有紧接着发送从机地址,而是SCL一直保持低电平。
~`$AOTNJ}5NGD%7QD(RXYMP.png

按本人的理解,iic发送开始信号之后,就会紧接着发送从机地址,中间并不需要从机作任何响应或者其它动作。

因此,就这个现象,我在此真诚地向诸位大神请教:究竟是我的理解或程序出错,还是我的launchpad有问题,抑或是芯片模块本身就有问题!



PS:这个IIC通讯,我已经折腾了几天了,并没有不经思考就来求助,开始是在利用库进行应用开发,发现IIC如何都不通,于是就回归本源,找到TI的例程试试看,结果却是:然并卵!也许问题可能很简单,但作为程序猿,有时陷入思维漩涡,没考虑到,也是人之常情,因此,不爽请勿喷,我的小心脏很脆弱的!


回复

使用道具 举报

37

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2015-8-10 17:23 | 显示全部楼层
#include "msp.h"
#include

uint8_t TXData[]= {0xA1,0xB1,0xC1,0xD1};        // Pointer to TX data
uint8_t SlaveAddress[]= {0xA0,0xA0,0xA0,0xA0};
uint8_t TXByteCtr;
uint8_t SlaveFlag = 0;

int main(void)
{
    volatile uint32_t i;
    WDTCTL = WDTPW | WDTHOLD;                         // Stop watchdog timer

    // Configure Pins for I2C
    P1SEL0 |= BIT6 | BIT7;                            // I2C pins
    P1REN  |= BIT6 | BIT7;
    P1OUT  |= BIT6 | BIT7;
     
    __enable_interrupt();
    NVIC_ISER0 = 1 << ((INT_EUSCIB0 - 16) & 31); // Enable eUSCIB0 interrupt in NVIC module

    // Configure USCI_B0 for I2C mode
    UCB0CTLW0 |= UCSWRST;                             // put eUSCI_B in reset state
    UCB0CTLW0 |= UCMODE_3 | UCMST;                    // I2C master mode, SMCLK
    UCB0BRW = 0x001E;                                 // baudrate = SMCLK /24
    UCB0CTLW0 &=~ UCSWRST;                            // clear reset register
    UCB0IE |= UCTXIE0 | UCNACKIE;                     // transmit and NACK interrupt enable

    SlaveFlag =0;

    while(1)
    {
    SCB_SCR |= SCB_SCR_SLEEPONEXIT;                   // Don't wake up on exit from ISR
    for (i = 1000; i > 0; i--);                       // Delay between transmissions
    UCB0I2CSA = SlaveAddress[SlaveFlag];              // configure slave address
    TXByteCtr = 2;                                    // Load TX byte counter
    while (UCB0CTLW0 & UCTXSTP);                      // Ensure stop condition got sent
    UCB0CTLW0 |= UCTR | UCTXSTT;                      // I2C TX, start condition

    __sleep();
    __no_operation();
    // Change Slave address
    SlaveFlag++;
    if (SlaveFlag>3)                                  // Roll over slave address
      {
        SlaveFlag =0;
      }
    }
}

// I2C interrupt service routine
void eUSCIB0IsrHandler(void)
{
    if (UCB0IFG & UCNACKIFG)
    {
            UCB0IFG &= ~ UCNACKIFG;
        UCB0CTL1 |= UCTXSTT;                  // I2C start condition
    }
    if (UCB0IFG & UCTXIFG0)
    {
            UCB0IFG &= ~ UCTXIFG0;
        if (TXByteCtr)                                // Check TX byte counter
           {
            UCB0TXBUF = TXData[SlaveFlag];            // Load TX buffer
            TXByteCtr--;                              // Decrement TX byte counter
           }
        else
           {
            UCB0CTLW0 |= UCTXSTP;                     // I2C stop condition
            UCB0IFG &= ~UCTXIFG;                      // Clear USCI_B0 TX int flag
            SCB_SCR &= ~SCB_SCR_SLEEPONEXIT;          // Wake up on exit from ISR
           }
    }
}


擦~  代码半天搞不上去!

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

关闭

站长推荐上一条 1/5 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2020-6-2 17:35 , Processed in 0.111957 second(s), 23 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表