|
我要用TMS320C6748控制云台转动(基于Visca协议),利用串口RS232给云台发送命令,因为命令是用十六进制,比较长,所以我一个字节一个字节的发送,可是整个程序执行完,云台也没反应,也没有一个返回值。UART初始化什么的我是基于例程UART2_INT改写的,发送和接收命令的函数我是基于uart.c的UARTCharGet()和UARTCharPut()函数改写的。搞了好久,一点头绪都没有,求大神帮忙解答因为我是一个新手,没搞过DSP,现在根本不知道怎么搞,下面是我的程序:
/*
* main.c
*/
#include"uart.h"
#include"uartStdio.h"
#include"psc.h"
#include"TL6748.h"
#include"soc_C6748.h"
#include "hw_types.h"
#include "gpio.h"
#include "hw_uart.h"
// 时钟
#define SYSCLK_1_FREQ (456000000)
#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
#define UART_2_FREQ (SYSCLK_2_FREQ)
/* 函数声明 */
/* */
/// 外设使能配置
void PSCInit(void);
// GPIO 管脚复用配置
void GPIOBankPinMuxSet();
// GPIO 管脚初始化
void GPIOBankPinInit();
// UART 初始化
void UARTInit(void);
// 延时
void Delay(unsigned int n);
//命令输出,把发送给云台的命令和云台的返回指令在console控制台输出
void CommandGet(unsigned int a[]);
//发送命令
void CommandTx(unsigned int b[]);
//接收命令
unsigned int CommandRx();
int main(void) {
unsigned int i,command[9]={0x83,0x01,0x06,0x05,0xFF},Value[8]={0}; //设置UART2的寄存器的基地址和发送给云台的控制命令
// 外设使能配置
PSCInit();
// GPIO 管脚复用配置
GPIOBankPinMuxSet();
// UART 初始化
UARTInit();
CommandTx(command);
CommandGet(command);
Delay(0x00FFFFFF);
for(i=0;i<8;i++)
Value=CommandRx();
CommandGet(Value);
}
/****************************************************************************/
/* */
/* PSC 初始化 */
/* */
/****************************************************************************/
void PSCInit(void)
{
// 对相应外设模块的使能也可以在 BootLoader 中完成
// 使能 UART2模块
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
}
/****************************************************************************/
/* */
/* GPIO 管脚复用配置 */
/* */
/****************************************************************************/
void GPIOBankPinMuxSet(void)
{
// UART2 禁用流控
UARTPinMuxSetup(2, FALSE);
}
/****************************************************************************/
/* */
/* UART 初始化 */
/* */
/****************************************************************************/
void UARTInit(void)
{ unsigned int uartClk=UART_2_FREQ,baseAdd=SOC_UART_2_REGS; //设置UART时钟
unsigned int baudrate=9600; //波特率为9600bit/s
unsigned int config=UART_WORDL_8BITS; //设置数据位为8位,停止位为1位,无奇偶校验位
unsigned int overSampRate=UART_OVER_SAMP_RATE_16; //产生一个16*参考时钟用于内部发送和接收逻辑
UARTConfigSetExpClk (baseAdd,uartClk,baudrate,config,overSampRate);
// 使能 UART2
UARTEnable(SOC_UART_2_REGS);
// 使能接收 / 发送 FIFO
UARTFIFOEnable(SOC_UART_2_REGS);
// 设置 FIFO 级别
UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);
}
/****************************************************************************/
/* */
/* 延时 */
/* */
/****************************************************************************/
void Delay(unsigned int n)
{
unsigned int i;
for(i=n;i>0;i--);
}
/****************************************************************************/
/* */
/* 命令输出 */
/* */
/****************************************************************************/
void CommandGet(unsigned int a[])
{ unsigned char num[18] = {0};
unsigned int i,j=0,k;
for(i=0;a;i++)
{ if((16 - a/16) <= 6)
{ num[j]=a/16+0x37;}
else
{ num[j]=a/16+0x30;}
j++;
if((16 - a%16) <= 6)
{ num[j]=a%16+0x37;}
else
{ num[j]=a%16+0x30;}
j++;
}
for(k=0;num[k];k++)
printf("%c\n",num[k]);
}
//发送命令
void CommandTx(unsigned int b[])
{unsigned int i,txEmpty;
for(i=0;b;i++)
{txEmpty = (UART_THR_TSR_EMPTY | UART_THR_EMPTY);
/*
** Here we check for the emptiness of both the Trasnsmitter Holding
** Register(THR) and Transmitter Shift Register(TSR) before writing
** data into the Transmitter FIFO(THR for non-FIFO mode).
*/
while (txEmpty!=(HWREG(SOC_UART_2_REGS + UART_LSR) & txEmpty));
HWREG(SOC_UART_2_REGS + UART_THR) =b;
}
}
//接收命令
unsigned int CommandRx()
{int data = 0;
/*
** Busy check if data is available in receiver FIFO(RBR regsiter in non-FIFO
** mode) so that data could be read from the RBR register.
*/
while ((HWREG(SOC_UART_2_REGS + UART_LSR) & UART_DATA_READY) == 0);
data = (int)HWREG(SOC_UART_2_REGS + UART_RBR);
return data;}
|
|