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.

MSP430f169进行IIC通信后通过串口与PC机通信问题



目前IIC通信的部分已调通,可获得从机发来的字节

想将收到的字节通过uart发送到PC机上,先进行uart初始化,串口发送结束后再进行IIC初始化,继续IIC通信

但提示出错,存在中断向量表冲突的问题,部分程序和错误如下:

//*************************************************************************
// 处理来自串口 0 的发送中断,预留
//*************************************************************************

#pragma vector=UART0TX_VECTOR
__interrupt void UART0_TX_ISR(void)
{

}

#pragma vector=USART0TX_VECTOR //IIC中断向量,包括八个中断标志位
__interrupt void ISR_I2C(void)
{
switch (I2CIV) //中断向量寄存器,决定了IIC中具体哪个中断被出发
{
case I2CIV_AL:
{
//仲裁中断
break;
}
case I2CIV_NACK: //无应答信号中断
{
//NACK中断
P3OUT |=BIT2;
delay_ms(10);
P3OUT &=~BIT2;
break;
}
case I2CIV_OA:
{
//自己地址中断
break;
}
case I2CIV_ARDY:
{
//访问准备好中断
break;
}
case I2CIV_RXRDY:
{
//接收准备好中断
I2CBuffer[0]=I2CDRB;
break;
}
case I2CIV_TXRDY:
{
//发送准备好中断
I2CDRB = I2CBuffer[tx_count];
tx_count = tx_count - 1;
if (tx_count < 0)
{
//禁止发送中断
I2CIE &= ~TXRDYIE;
}
break;
}
case I2CIV_GC:
{
//一般调用中断
break;
}
case I2CIV_STT:
{

//起始条件中断
break;
}
}
}

对该部分提示:

Error[Be004]: function "ISR_I2C" has overlaid vector with function 

"UART0_TX_ISR" , second vector deleted

我的IIC和uart初始化程序如下:

/*************************************************************************
MSP430串口初始化
*************************************************************************/
void UART_Init()
{
U0CTL&=~I2C;
U0CTL&=~SYNC;
U0CTL|=SWRST + CHAR; //复位SWRST,8位数据模式
U0TCTL|=SSEL1; //SMCLK为串口时钟
U0BR1=baud_h; //BRCLK=8MHZ,Baud=BRCLK/N
U0BR0=baud_l; //N=UBR+(UxMCTL)/8
U0MCTL=0x00; //微调寄存器为0,波特率9600bps
ME1|=UTXE0; //UART0发送使能
ME1|=URXE0; //UART0接收使能
U0CTL&=~SWRST;
IE1|=URXIE0; //接收中断使能位

P3SEL|= BIT4 + BIT5; //设置IO口为第二功能模式,启用UART功能
P3DIR|= BIT4; //设置TXD0口方向为输出
}


/************************************************************************
串口0发送数据函数
*************************************************************************/

void Send_Byte(unsigned char data)
{
while((IFG1&UTXIFG0)==0); //发送寄存器空的时候发送数据
U0TXBUF=data;
}

/*--------------------------------------------------------
---I2C初始化函数
----------------------------------------------------------*/
void I2c_Init(void)
{
//将P3.1和P3.3设置为I2C管脚
//P3SEL |= 0X0A;
//设置P3.1和P3.3管脚的方向
P3DIR |= 0x0A;
SDA_1;
SCL_1;
P3SEL |= 0X0A;
//选择为I2C模式
U0CTL |= I2C + SYNC;
//禁止I2C模块
U0CTL &= ~I2CEN;
//设置I2C为7位地址模式,不使用DMA,
//字节模式,时钟源为SMCLK,
//设置成传输模式
I2CTCTL = I2CTRX + I2CSSEL_2;
//定义从器件地址
I2CSA = SLAVEADDR;
//设置本身的地址
I2COA = 0x01A5;
//I2C时钟为SMCLK / 160
I2CPSC = 159;
//SCL 高电平为:5 *I2C 时钟
I2CSCLH = 0x03;
//SCL 低电平为:5 *I2C 时钟
I2CSCLL = 0x03;
//I2C 模块有效
U0CTL |= I2CEN;
tx_count = 0;
rx_count = 0;

}

进行串口发送时主函数如下:

while(1)
{
ZT = ad5933_read(0x8f);

UART_Init();
_EINT();
Send_Byte(ZT);
delay_ms(10);


I2c_Init();

_EINT(); //打开中断
I2CWriteInit();
}

求问如何解决这一问题?

真诚的谢谢您!

  • Liyao Wang1 说:

    目前IIC通信的部分已调通,可获得从机发来的字节

    想将收到的字节通过uart发送到PC机上,先进行uart初始化,串口发送结束后再进行IIC初始化,继续IIC通信

    但提示出错,存在中断向量表冲突的问题,部分程序和错误如下:

    //*************************************************************************
    // 处理来自串口 0 的发送中断,预留
    //*************************************************************************

    #pragma vector=UART0TX_VECTOR
    __interrupt void UART0_TX_ISR(void)
    {

    }

    #pragma vector=USART0TX_VECTOR //IIC中断向量,包括八个中断标志位
    __interrupt void ISR_I2C(void)
    {
    switch (I2CIV) //中断向量寄存器,决定了IIC中具体哪个中断被出发
    {
    case I2CIV_AL:
    {
    //仲裁中断
    break;
    }
    case I2CIV_NACK: //无应答信号中断
    {
    //NACK中断
    P3OUT |=BIT2;
    delay_ms(10);
    P3OUT &=~BIT2;
    break;
    }
    case I2CIV_OA:
    {
    //自己地址中断
    break;
    }
    case I2CIV_ARDY:
    {
    //访问准备好中断
    break;
    }
    case I2CIV_RXRDY:
    {
    //接收准备好中断
    I2CBuffer[0]=I2CDRB;
    break;
    }
    case I2CIV_TXRDY:
    {
    //发送准备好中断
    I2CDRB = I2CBuffer[tx_count];
    tx_count = tx_count - 1;
    if (tx_count < 0)
    {
    //禁止发送中断
    I2CIE &= ~TXRDYIE;
    }
    break;
    }
    case I2CIV_GC:
    {
    //一般调用中断
    break;
    }
    case I2CIV_STT:
    {

    //起始条件中断
    break;
    }
    }
    }

    对该部分提示:

    Error[Be004]: function "ISR_I2C" has overlaid vector with function 

    "UART0_TX_ISR" , second vector deleted

    我的IIC和uart初始化程序如下:

    /*************************************************************************
    MSP430串口初始化
    *************************************************************************/
    void UART_Init()
    {
    U0CTL&=~I2C;
    U0CTL&=~SYNC;
    U0CTL|=SWRST + CHAR; //复位SWRST,8位数据模式
    U0TCTL|=SSEL1; //SMCLK为串口时钟
    U0BR1=baud_h; //BRCLK=8MHZ,Baud=BRCLK/N
    U0BR0=baud_l; //N=UBR+(UxMCTL)/8
    U0MCTL=0x00; //微调寄存器为0,波特率9600bps
    ME1|=UTXE0; //UART0发送使能
    ME1|=URXE0; //UART0接收使能
    U0CTL&=~SWRST;
    IE1|=URXIE0; //接收中断使能位

    P3SEL|= BIT4 + BIT5; //设置IO口为第二功能模式,启用UART功能
    P3DIR|= BIT4; //设置TXD0口方向为输出
    }


    /************************************************************************
    串口0发送数据函数
    *************************************************************************/

    void Send_Byte(unsigned char data)
    {
    while((IFG1&UTXIFG0)==0); //发送寄存器空的时候发送数据
    U0TXBUF=data;
    }

    /*--------------------------------------------------------
    ---I2C初始化函数
    ----------------------------------------------------------*/
    void I2c_Init(void)
    {
    //将P3.1和P3.3设置为I2C管脚
    //P3SEL |= 0X0A;
    //设置P3.1和P3.3管脚的方向
    P3DIR |= 0x0A;
    SDA_1;
    SCL_1;
    P3SEL |= 0X0A;
    //选择为I2C模式
    U0CTL |= I2C + SYNC;
    //禁止I2C模块
    U0CTL &= ~I2CEN;
    //设置I2C为7位地址模式,不使用DMA,
    //字节模式,时钟源为SMCLK,
    //设置成传输模式
    I2CTCTL = I2CTRX + I2CSSEL_2;
    //定义从器件地址
    I2CSA = SLAVEADDR;
    //设置本身的地址
    I2COA = 0x01A5;
    //I2C时钟为SMCLK / 160
    I2CPSC = 159;
    //SCL 高电平为:5 *I2C 时钟
    I2CSCLH = 0x03;
    //SCL 低电平为:5 *I2C 时钟
    I2CSCLL = 0x03;
    //I2C 模块有效
    U0CTL |= I2CEN;
    tx_count = 0;
    rx_count = 0;

    }

    进行串口发送时主函数如下:

    while(1)
    {
    ZT = ad5933_read(0x8f);

    UART_Init();
    _EINT();
    Send_Byte(ZT);
    delay_ms(10);


    I2c_Init();

    _EINT(); //打开中断
    I2CWriteInit();
    }

    求问如何解决这一问题?

    真诚的谢谢您!

    因为IIC与UART0共用一个IP,所以你可能需要用UART1来实现你的应用了。