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.

[参考译文] CCS/MSP430F6659:使用外部clk时的I2C问题

Guru**** 2595770 points
Other Parts Discussed in Thread: MSP430F6659

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/637373/ccs-msp430f6659-i2c-problem-using-external-clk

部件号:MSP430F6659

工具/软件:Code Composer Studio

对于I2C通信,我们使用MSP430F6659 作为主控制器,使用PCA9505作为从控制器。 我们通过DCO在内部生成时钟,I2C工作正常,但UART通信在9600波特8N1下不能正常工作。如果我们为每个字节添加一毫秒延迟, 我们将获得正确的输出。要消除这种情况,我们使用的是外部时钟 (i.ext2 = 20Mhz晶体振荡 器),在这种情况下,UART工作正常,但I2C正在构建(未生成停止条件)。我们正在添加延迟并在 调试模式下执行,它正在工作,但不在连续模式下工作。通过增加除法因子,I2C也无法正常工作。

此致

Vasavi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这可能是您的代码中的一个问题。 您未显示的内容。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    ////// 有不同的从属设备,因此我们在写操作////////中进行初始化

    write (unsigned char slaver_addr,unsigned char iocreg_addr,unsigned char iocreg_val,unsigned char opreg_addr,unsigned char opreg_val)

    P8SEL = BIT5 | BIT6;//端口选择

    UCB0CTL1 || UCSWRST;//禁用USCI
    UCB1CTL0 = UCMST | UCMODE_3 | UCSYNC;//主模式,同步,I2C模式
    UCB1CTL1 = UCSSEL_2 | UCSSWRST;//已选择SMCLK
    UCB1I2CSA = slaver_addr;//从属地址
    UCB1BR0 = 50;//I2C数据速率~ 20MHz/400K=50
    UCB1BR1 = 0;
    UCB1CTL1 &=~UCSWRST;//启用USC

    UCB1I2CSA = slaver_addr;//从属地址

    期间(UCB1CTL1和UCTXSTT);
    UCB1CTL1 || UCTXSTT | UCTR;//启动条件发送从属设备的地址,传输模式

    while (!(UCB1IFG & UCTXIFG));//等待数据移出
    UCB1TXBUF = iocreg_addr;//加载从I/O配置寄存器的地址

    while (!(UCB1IFG & UCTXIFG));//等待数据移出
    UCB1TXBUF = iocreg_val;//从I/O的加载地址配置寄存器值

    UCB1CTL1 || UCTXSTP;//发送停止消息

    UCB1I2CSA = slaver_addr;

    期间(UCB1CTL1和UCTXSTT);
    UCB1CTL1 || UCTXSTT | UCTR;//启动条件发送从属设备的地址,传输//模式

    while (!(UCB1IFG & UCTXIFG));//等待数据移出
    UCB1TXBUF =opreg_addr;//从输出寄存器的加载地址

    while (!(UCB1IFG & UCTXIFG));//等待数据移出
    UCB1TXBUF = opreg_val;//从输出寄存器值的加载地址

    UCB1CTL1 || UCTXSTP;//发送停止消息

    }
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    1.您是否也可以发布UART代码?

    2.尝试以下操作:
    更改:UCB0CTL1 || UCSWRST;//禁用USCI
    至:UCB1CTL1 |= UCSWRST; //禁用USCI
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我更改了UCB1CTL1|=UCWRST,但它正在进行中
    while (!(UCB1IFG & UCTXIFG));//等待数据移出//// 在此位置进行割茬
    UCB1TXBUF = iocreg_val;
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    请尝试以下操作:
    write (unsigned char slaver_addr,unsigned char iocreg_addr,unsigned char iocreg_val,unsigned char opreg_addr,unsigned char opreg_val)

    //init
    UCB1CTL1 || UCSRST;//禁用USCI
    UCB1CTL0 = UCMST | UCMODE_3 | UCSYNC;//主模式,同步,I2C模式
    UCB1CTL1 = UCSSEL_2 | UCSSWRST;//已选择SMCLK
    UCB1I2CSA = slaver_addr;//从属地址
    UCB1BR0 = 50;//I2C数据速率~ 20MHz/400K=50
    UCB1BR1 = 0;
    P8SEL = BIT5 | BIT6;//端口选择
    UCB1CTL1 &=~UCSWRST;//启用USC


    //第一个事务
    UCB1I2CSA = slaver_addr;

    UCB1CTL1 || UCTXSTT | UCTR;
    while (!(UCB1CTL1和UCTXSTT));

    UCB1TXBUF = iocreg_addr;
    while (!(UCB1IFG和UCTXIFG));

    UCB1TXBUF = iocreg_val;
    while (!(UCB1IFG和UCTXIFG));

    UCB1CTL1 || UCTXSTP;//发送停止消息
    while (UCB1CTL1和UCTXSTP);//等待直至停止

    //秒事务
    UCB1I2CSA = slaver_addr;//设置新的从属设备添加??

    UCB1CTL1 || UCTXSTT | UCTR;
    while (!(UCB1CTL1和UCTXSTT));

    UCB1TXBUF = opreg_addr;
    while (!(UCB1IFG和UCTXIFG));

    UCB1TXBUF = opreg_val;
    while (!(UCB1IFG和UCTXIFG));

    UCB1CTL1 || UCTXSTP;
    While (UCB1CTL1和UCTXSTP);


    //禁用USCI
    UCB1CTL1 |= UCSWRST;

    }
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    当从属设备确认启动位未清除时,启动位出现问题


    UCB1I2CSA = slaver_addr;

    UCB1CTL1 || UCTXSTT | UCTR;
    while (!(UCB1CTL1和UCTXSTT));

    UCB1TXBUF = iocreg_addr;
    while (!(UCB1IFG和UCTXIFG));///here UCTXSTT位未清除且未设置UCTXIFG位

    UCB1TXBUF = iocreg_val;
    while (!(UCB1IFG和UCTXIFG));