TMS320F28054F使用Vofa+ 调试
·
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();

以上是完整的开发流程和配置文件,实际工程中可以正常使用。
更多推荐
所有评论(0)