|  | 
 
| 我要用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;}
 
 
 
 | 
 |