TMS320F28054F使用Vofa+ 调试

实现目的

使用TMS320F28054F的SCI模块实现与VOFA+进行通信调试电机;使用Vofa+进行数据可视化

JustFloat数据格式

为解析一帧数据,JustFloat使用+Inf表示数据尾,转化为二进制即0x7f800000,按照小端数据存储,所以发送一帧数据时,数据尾要发送0x00,0x00,0x80,0x7f四个字节。VOFA+上位机中显示的数据格式如下图所示:
在这里插入图片描述

TMS320F28054F实现

SCI模块配置

1.IO口映射SCI外设
使用SCIA模块

    EALLOW;
    // 配置GPIO复用功能(映射到SCIA)
    GpioCtrlRegs.GPAMUX2.bit.GPIO28 = 1;   // GPIO28复用:1=SCIA_TX(0=GPIO,1=外设)
    GpioCtrlRegs.GPAMUX2.bit.GPIO29 = 1;   // GPIO29复用:1=SCIA_RX(0=GPIO,1=外设)
    // 配置输入输出方向
    GpioCtrlRegs.GPADIR.bit.GPIO28 = 0;   // 输出方向(RX引脚)0:输入;1:输出
    GpioCtrlRegs.GPADIR.bit.GPIO29 = 1;   // 输入方向(TX引脚)0:输入;1:输出
    EDIS;

2.SCI模块配置
这里使用波特率115200,SCI模块时钟默认使用LSPCLK = SYSCLK/4 ;
中断接收数据,轮循发送数据;

// 宏定义:60MHz主频下的参数
#define SYSCLK_FREQ     60000000UL   // 系统主频60MHz
#define LSPCLK_FREQ     15000000UL   // LSPCLK = SYSCLK/4 = 15MHz
#define DESIRED_BAUD    115200UL     // 目标波特率115200
#define SCI_BRR_VALUE   ((LSPCLK_FREQ / (8 * DESIRED_BAUD)) - 1)  // BRR=14
EALLOW;
//禁用SCI模块(配置前先关闭)
SciaRegs.SCICCR.bit.SCICHAR = 7;     // 8位数据位
SciaRegs.SCICCR.bit.STOPBITS = 0;    // 1位停止位
SciaRegs.SCICCR.bit.PARITY = 0;      // 无奇偶校验
SciaRegs.SCICCR.bit.LOOPBKENA = 0;   // 禁用回环模式
SciaRegs.SCICCR.bit.ADDRIDLE_MODE = 0; // 空闲线模式
//配置波特率(60MHz主频,115200波特率)
 SciaRegs.SCIHBAUD = (SCI_BRR_VALUE >> 8) & 0x000F;  // 波特率高位(0)
SciaRegs.SCILBAUD = SCI_BRR_VALUE & 0x00FF;         // 波特率低位(14)
//使能TX/RX,配置模式
SciaRegs.SCICTL1.bit.TXENA = 1;      // 使能发送
SciaRegs.SCICTL1.bit.RXENA = 1;      // 使能接收
SciaRegs.SCICTL1.bit.SWRESET = 1;    // 复位SCI(释放复位)
//配置FIFO(减少中断频率,推荐使用)
SciaRegs.SCIFFTX.all = 0xE040;       // 使能TX FIFO,复位TX FIFO
SciaRegs.SCIFFRX.all = 0x2041;       // 使能RX FIFO,RX FIFO有1个字符就触发中断
SciaRegs.SCIFFCT.all = 0x00;         // 禁用FIFO延时
//使能SCI FIFO中断
SciaRegs.SCIFFTX.bit.TXFIFOXRESET = 1;
SciaRegs.SCIFFRX.bit.RXFIFORESET = 1;
//配置SCI中断向量
PieVectTable.SCIRXINTA = &sciaRxFifoIsr; // 接收中断映射到自定义ISR
// 清除PIE级中断标志
PieCtrlRegs.PIEIFR9.bit.INTx1 = 0;
// 使能PIE级中断(SCIA RX INT映射到PIE9.1)
PieCtrlRegs.PIEIER9.bit.INTx1 = 1;
// 使能SCI RX FIFO中断
SciaRegs.SCICTL2.bit.RXBKINTENA = 1;
SciaRegs.SCIFFRX.bit.RXFFIENA = 1;   // 使能RX FIFO中断
SciaRegs.SCIFFRX.bit.RXFFIL = 1;     // RX FIFO有1个字符就触发中断
//使能CPU级中断(INT9对应SCI A)
IER |= M_INT9;               // 使能CPU级第9组中断(SCI-A属于9组)
EDIS;

3.中断接收数据

// SCI接收中断服务函数:接收FIFO满(阈值8)时触发
// 全局缓冲区(用于中断收发数据)
Uint8 g_rx_buf[8] = {0};
Uint16 g_rx_idx = 0;              // 接收缓冲区索引
interrupt void sciaRxFifoIsr(void)
{
    // 1. 读取FIFO中的所有数据到接收缓冲区
    while(SciaRegs.SCIFFRX.bit.RXFFST > 0) // 只要FIFO有数据就读取
    {
        g_rx_buf[g_rx_idx++] = (Uint8)SciaRegs.SCIRXBUF.all;
        // 缓冲区满则重置索引,避免溢出
        if(g_rx_idx >= 8)   //8个字节
        {
            g_rx_idx = 0;
        }
    }
    //清除接收中断标志,ACK PIE中断
    SciaRegs.SCIFFRX.bit.RXFFINTCLR = 1; // 清除RX FIFO中断标志
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP9; // 确认9组中断
}

4.轮循发送数据

// 查询式发送单个字节(等待发送缓冲区空闲)
void SCISendByte(Uint16 data)
{
    // 等待TX FIFO有空位
    while(SciaRegs.SCIFFTX.bit.TXFFST != 0);
    // 写入发送寄存器
    SciaRegs.SCITXBUF = data;
}

// 查询式发送字符串(逐个字节发送)
void SCISendString(char *str)
{
    while(*str != '\0')
    {
        SCISendByte(*str);
        str++;
    }
}

VOFA+上位机与MCU下位机配置

1.VOFA+配置如下图所示:
选择JustFloat协议,选择对应的com口和波特率;
在这里插入图片描述
2.mcu配置
利用共用体不同类型成员共用同一存储空间的特性,定义一个单精度浮点数(32位),和两个无符号整型数(16位),则浮点数自动按照IEEE754标准转化为二进制进行存储,通过读两个无符号整型数可以解析出四个字节(8位),然后按照小端方式通过SCI发送出去。
共用体定义中使用两个Uint16数,而不是Unsigned char或者char,因为在DSP28335中数据最小存储单位是16位,char数据类型也是16位。
其中.H文件如下所示:

typedef union
{
    float32 DataFloat;          //发送数据通道
    Uint16 DataUint16[2];       //在DSP28054中数据最小存储单位是16位
}VOFA_FLOAT_UNION;

/* 声明指针类型 */
typedef VOFA_FLOAT_UNION *VOFA_FLOAT_UNION_HANDLE;

extern void VofaSendFloatFifo(VOFA_FLOAT_UNION_HANDLE,Uint16);;
extern void SCI_A_vofa_task(void);

其中.C文件如下所示:

#define data_ch  4          //数据通道数
VOFA_FLOAT_UNION DataSendCh[data_ch];                            // 发送数据

void SCI_A_vofa_task(void)
{
    /* 为浮点数赋值 */
    DataSendCh[0].DataFloat = adc_data.Ia_pu;
    DataSendCh[1].DataFloat = adc_data.Ib_pu;
    DataSendCh[2].DataFloat = adc_data.Ic_pu;
    DataSendCh[3].DataFloat = 4;
//    DataSendCh[4].DataFloat = 5;
//    DataSendCh[5].DataFloat = 6;
//    DataSendCh[6].DataFloat = 7;
//    DataSendCh[7].DataFloat = 8;
    VofaSendFloatFifo(DataSendCh,data_ch);
}

/* 浮点数发送函数 */
void VofaSendFloatFifo(VOFA_FLOAT_UNION* data,Uint16 len)
{
    Uint16 i,j;
    for(i = 0;i < len;i++)
    {
        for(j = 0;j < 2;j++)
        {
            VofaSendCharFifo(((data+i)->DataUint16[j])&0x00ff);
            VofaSendCharFifo((((data+i)->DataUint16[j])>>8)&0x00ff);
        }
    }
    /* 数据帧尾 */
    VofaSendCharFifo(0x00);
    VofaSendCharFifo(0x00);
    VofaSendCharFifo(0x80);
    VofaSendCharFifo(0x7f);
}

void VofaSendCharFifo(Uint16 data)
{
    while (SciaRegs.SCIFFTX.bit.TXFFST != 0);              // 等待发送FIFO为空
    SciaRegs.SCITXBUF = data;
}

调试效果

while中循环执行:SCI_A_vofa_task();
在这里插入图片描述
以上是完整的开发流程和配置文件,实际工程中可以正常使用。

更多推荐