嵌入式开发者社区

标题: 关于TMS320C6748的UART通信 [打印本页]

作者: qimange    时间: 2016-8-9 15:23
标题: 关于TMS320C6748的UART通信
我要用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;}



作者: IRONMAN    时间: 2016-8-9 18:56
你先用一个USB转串口连在电脑上通过串口调试助手观察你的数据是不是对的
作者: qimange    时间: 2016-8-9 19:02
这个我也想过,只是现在没这个连接线
作者: qimange    时间: 2016-8-11 14:37
数据就算不对,云台也会返回命令错误什么的指令,可是现在是什么返回值也没有




欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) Powered by Discuz! X3.4