TI中文支持网
TI专业的中文技术问题搜集分享网站

MSP430FR2353 IIC与从机通讯,想用中断方式发送接收数据?接收数据没有问题,发送数据失败,但是抓波形看到了发送的地址没有发送数据

/* –COPYRIGHT–,BSD_EX
* Copyright (c) 2016, Texas Instruments Incorporated
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* * Neither the name of Texas Instruments Incorporated nor the names of
* its contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*******************************************************************************
*
* MSP430 CODE EXAMPLE DISCLAIMER
*
* MSP430 code examples are self-contained low-level programs that typically
* demonstrate a single peripheral function or device feature in a highly
* concise manner. For this the code may rely on the device's power-on default
* register values and settings such as the clock configuration and care must
* be taken when combining code from several examples to avoid potential side
* effects. Also see www.ti.com/grace for a GUI- and www.ti.com/msp430ware
* for an API functional library-approach to peripheral configuration.
*
* –/COPYRIGHT–*/
//******************************************************************************
// MSP430FR235x Demo – eUSCI_B0 I2C Master RX multiple bytes from MSP430 Slave
//
// Description: This demo connects two MSP430's via the I2C bus. The master
// reads 5 bytes from the slave. This is the MASTER CODE. The data from the slave
// transmitter begins at 0 and increments with each transfer.
// The USCI_B0 RX interrupt is used to know when new data has been received.
// ACLK = default REFO ~32768Hz, MCLK = SMCLK = BRCLK = DCODIV ~1MHz.
//
// *****used with "msp430fr235x_euscib0_i2c_11.c"****
//
// /|\ /|\
// MSP430FR2355 10k 10k MSP430FR2355
// slave | | master
// —————– | | —————–
// | P1.2/UCB0SDA|<-|—-|->|P1.2/UCB0SDA |
// | | | | |
// | | | | |
// | P1.3/UCB0SCL|<-|——>|P1.3/UCB0SCL |
// | | | P1.0|–> LED
//
// Cash Hao
// Texas Instruments Inc.
// November 2016
// Built with IAR Embedded Workbench v6.50.0 & Code Composer Studio v6.2.0
//******************************************************************************
#include <msp430.h>

volatile unsigned char RXData[128];
int i =0,r=0;
void init_receive(void)
{
// Configure USCI_B0 for I2C mode
UCB0CTLW0 |= UCSWRST; // Software reset enabled
UCB0CTLW0 |= UCMODE_3 | UCMST | UCSYNC; // I2C mode, Master mode, sync
UCB0CTLW1 |= UCASTP_2; // Automatic stop generated
// after UCB0TBCNT is reached
UCB0BRW = 0x0008; // baudrate = SMCLK / 8
UCB0TBCNT = 0x0005; // number of bytes to be received
UCB0I2CSA = 0x0048; // Slave address
UCB0CTLW0 &=~UCTR; //接收模式
UCB0CTL1 &= ~UCSWRST;
UCB0IE &=~UCTXIE; //停止发送中断
UCB0IE |= UCRXIE | UCNACKIE | UCBCNTIE;

}
void init_trans(void)
{
// Configure USCI_B0 for I2C mode
UCB0CTLW0 |= UCSWRST; // put eUSCI_B in reset state
UCB0CTLW0 |= UCMODE_3 | UCMST | UCSYNC; // I2C master mode, SMCLK
UCB0BRW = 0x8; // baudrate = SMCLK / 8
UCB0CTLW0 |=UCTR; //发送模式
UCB0I2CSA = 0x48; // configure slave address
UCB0CTLW0 &=~ UCSWRST; // clear reset register
UCB0IE &=~UCRXIE; //停止接收中断
UCB0IE |= UCTXIE | UCNACKIE | UCBCNTIE; // transmit and NACK interrupt enable
}
int main(void)
{
WDTCTL = WDTPW | WDTHOLD;

// Configure GPIO

P1SEL0 |= BIT2 | BIT3; // I2C pins

// Disable the GPIO power-on default high-impedance mode to activate
// previously configured port settings
PM5CTL0 &= ~LOCKLPM5;

_EINT();
_NOP();
while (1)
{

//配置成接收模式中断接收字节
init_receive();
while (UCB0CTL1 & UCTXSTP); // Ensure stop condition got sent
UCB0CTL1 |= UCTXSTT; // I2C start condition

__delay_cycles(2000);
//配置成发送模式发送字节 中断发送字节
init_trans();
while (UCB0CTLW0 & UCTXSTP); // Ensure stop condition got sent
UCB0CTLW0 |= UCTR | UCTXSTT; // I2C TX, start condition
__delay_cycles(10000);

}
}

#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector = USCI_B0_VECTOR
__interrupt void USCIB0_ISR(void)
#elif defined(__GNUC__)
void __attribute__ ((interrupt(USCI_B0_VECTOR))) USCIB0_ISR (void)
#else
#error Compiler not supported!
#endif
{
switch(__even_in_range(UCB0IV, USCI_I2C_UCBIT9IFG))
{
case USCI_NONE: break; // Vector 0: No interrupts
case USCI_I2C_UCALIFG: break; // Vector 2: ALIFG
case USCI_I2C_UCNACKIFG: // Vector 4: NACKIFG
UCB0CTL1 |= UCTXSTT; // I2C start condition
break;
case USCI_I2C_UCSTTIFG: break; // Vector 6: STTIFG
case USCI_I2C_UCSTPIFG: break; // Vector 8: STPIFG
case USCI_I2C_UCRXIFG3: break; // Vector 10: RXIFG3
case USCI_I2C_UCTXIFG3: break; // Vector 14: TXIFG3
case USCI_I2C_UCRXIFG2: break; // Vector 16: RXIFG2
case USCI_I2C_UCTXIFG2: break; // Vector 18: TXIFG2
case USCI_I2C_UCRXIFG1: break; // Vector 20: RXIFG1
case USCI_I2C_UCTXIFG1: break; // Vector 22: TXIFG1
case USCI_I2C_UCRXIFG0: // Vector 24: RXIFG0
RXData[i] = UCB0RXBUF; // Get RX data
i++;
if(i>52)
{
i=0;

}

break;
case USCI_I2C_UCTXIFG0:

UCB0TXBUF = 0x55; // Load TX buffer

UCB0CTLW0 |= UCTXSTP; // I2C stop condition
UCB0IFG &= ~UCTXIFG; // Clear USCI_B0 TX int flag
r++;
if(r>20)
{
r=0;
}

break; // Vector 26: TXIFG0

case USCI_I2C_UCBCNTIFG: // Vector 28: BCNTIFG

break;
case USCI_I2C_UCCLTOIFG: break; // Vector 30: clock low timeout
case USCI_I2C_UCBIT9IFG: break; // Vector 32: 9th bit
default: break;
}
}

//以上是我参考TI官方提供的例程,两个合在一块,接收正常,但是发送失败?不知道自己配置哪里出现问题,单独两个例程(master  读例程 master写例程)与从机测试都OK

user5707170:

看波形是把写数据的地址发送出去了,但是要发送的数据没有发送出去也有停止信号,开始信号还有应答,数据不知道怎么没有发送出去

user5707170:

回复 Susan Yang:

你好,方便提供下,与这个master  对应的slave 例程吗?我网上下载,被限制,能否提供下,非常感谢你

灰小子:

回复 user5707170:

例程都在msp430ware里,帮你上传iic相关的

msp430fr235x_euscib0_i2c_10.c

msp430fr235x_euscib0_i2c_11.cmsp430fr235x_euscib0_i2c_15.c

msp430fr235x_euscib0_i2c_16.c

user5707170:

回复 灰小子:

你好,这个我有这方面的例程,主机和从机对应的只有单发,单收,(我都调试了,没有出现任何问题)我想要的是主机能发能收,从机也能发也能收,我调试的就是您给的这个例程,做从机,自己模拟IIC master对他进行收发会出现丢字节的现象,

user5707170:

回复 user5707170:

你好,我想用从机接收完数据产生ACK应答或者NACK应答,不知怎么配置下?我这两天测试自己模拟主机与咱们官方提供的从机例程进行通讯会出现丢字节的现象,并且还是特别有规律,用咱们硬件单独提供的master例程去测试硬件slave例程没有出现任何问题,master例程没有是不发送ACK应答,有点想不通是哪里出现的问题

user5707170:

回复 Susan Yang:

你好,我想用从机接收完数据产生ACK应答或者NACK应答,不知怎么配置下?我这两天测试自己模拟主机与咱们官方提供的从机例程进行通讯会出现丢字节的现象,并且还是特别有规律,用咱们硬件单独提供的master例程去测试硬件slave例程没有出现任何问题,master例程没有是不发送ACK应答,有点想不通是哪里出现的问题

赞(0)
未经允许不得转载:TI中文支持网 » MSP430FR2353 IIC与从机通讯,想用中断方式发送接收数据?接收数据没有问题,发送数据失败,但是抓波形看到了发送的地址没有发送数据
分享到: 更多 (0)