使用5502自带的UART口发送数据乱码的问题

由于要使用5502的UART口与FT2232H的UART口进行通信,因此先用CSL对UART口进行编程测试。

在测试过程中发现,5502的UART口可以与FT2232H的UART连接上,但是FT2232H收到的数据全是乱码。

代码如下:

View Code
#include <stdio.h>
#include
<csl.h>
#include
<csl_uart.h>
#include
<csl_irq.h>

#define LEN 4;

UART_Setup Params
= {
UART_CLK_INPUT_20,
UART_BAUD_9600,
UART_WORD8,
UART_STOP1,
UART_DISABLE_PARITY,
UART_FIFO_DISABLE,
UART_NO_LOOPBACK
};

void sleep(int time){
int i = 0;
for(;i < time; i++){
}

}

Uint16 getURTHR(){
Uint16 ret;
ret
= UART_RGET(URTHR);
return ret;
}

void main(){

CSLBool retFlag;
const int putchar = 5;
Uint16 regVal;
Uint16 URTHRval;
char *send = "hello world!!\n";

CSL_init();
//调用任何CSL模块API之前都要使用的语句
UART_setup(&Params);

CHIP_FSET(XBSR,SP2MODE,
0);
regVal
= CHIP_RGET(XBSR);

printf(
"XBSR value: %x \n",regVal);

URTHRval
= getURTHR();
printf(
"URTHR value: %x \n",URTHRval);


retFlag
= UART_fputc(putchar,0);
if(retFlag){
printf(
"putchar correct\n");
}



printf(
"%s",send);
retFlag
= UART_write(send,15,0);
if(retFlag){
printf(
"UART write Correct!\n");
}

URTHRval
= getURTHR();
printf(
"URTHR value: %x \n",URTHRval);
// sleep(50);

printf(
"hello world\n");
}

  

  现在怀疑是不是因为时钟的原因,导致的乱码。

即FT2232H的时钟和DSP的时钟不同,导致采样的频率不同,以至于FT2232H采集到的数据和DSP发出的数据不同。

目前问题尚未解决。

现在在设置了PLL之后,反而接收不到任何数据了,读URTHR的状态是0.

重启计算机和DSP都没用。

将目标板掉电后重新上电即可恢复原来的状态。

目标板掉电后寄存器中的值会清空。

------------2011.7.18---------

1、后来使用示波器检查DSP的TX腿发出的信号,波形是没问题的,但是波特率有问题。

细心的烤鸡翅同学发现是时钟的问题。

在不启用PLL MODE 的情况下UART的默认输入时钟为5MHz,但是CSL编程接口提供的输入时钟最小为20MHZ。

所以当按照20MHZ来计算的时候,其实与真正的输入时钟不符。

具体PLL MODE 的用法还在研究中。

2、今天在测试数据接收的时候也发现了问题,就是中断的回调函数没有被调起的问题。

现在是enable了相应的events,同时也设置了回调函数结构体(结构体中包含各个相应回调函数的指针)。

可是在event发生的时候,相应的回调函数并没有被调用。

因此,今天需要把PLL和INTERRUPT的部分都好好看看。

目前乱码的问题已经找到原因,但还是没有从根源上解决(应该通过设置PLL来解决,而不是修改结构体的参数为默认值)。

最新的代码更新如下:

View Code
#include <stdio.h>
#include
<csl.h>
#include
<csl_uart.h>
#include
<csl_irq.h>
#include
<csl_pll.h>

#define LEN 4;

void myRead();
void sendDataEmpty();

UART_Setup Params
= {
5,/*UART_CLK_INPUT_20*/
UART_BAUD_9600,
UART_WORD8,
UART_STOP1,
UART_ODD_PARITY,
UART_FIFO_DMA1_TRIG01,
UART_NO_LOOPBACK
};

UART_IsrAddr isrAddr
= {
NULL,
myRead,
sendDataEmpty,
NULL
};

void sleep(int time){
int i = 0;
for(;i < time; i++){
}
}

void initialMyUART(){
Uint16 regVal,fieldVal;

UART_setCallback(
&isrAddr); //设置回调函数
UART_eventEnable(0x01|0x02); // Enable receiver and transmiter interrupts

UART_FSET(URLCR,DLAB,
1); //让公共地址指向DLM和DLL
UART_FSET(URPECR,FREE,1); //确保在EMULATOR过程中UART不停止
fieldVal = UART_FGET(URPECR,FREE);
printf(
"FREE bit: %d \n",fieldVal);
// UART_FSET(URPECR,URST,0);//重启UART

// CHIP_FSET(XBSR,SP2MODE,0);
regVal = CHIP_FGET(XBSR,SP2MODE);
printf(
"GPIO7 value: %d \n",regVal);


// PLL_FSET(PLLCSR,PLLEN,1);


regVal
= PLL_RGET(PLLCSR);
printf(
"PLLCSR value: %d \n",regVal);

//显示分频寄存器的值
regVal = UART_RGET(URDLM);
printf(
"URDLM value: %d \n",regVal);
regVal
= UART_RGET(URDLL);
printf(
"URDLL value: %d \n",regVal);

}

void myRead(){

char receive[512];
CSLBool retFlag;

printf(
"进入回调函数\n");

retFlag
= UART_read(receive,5,10);
if(retFlag){
printf(
"UART read success\n");
}

}

void sendDataEmpty(){
printf(
"transmiter holding register empty!\n");
}
void main(){

CSLBool retFlag;
const int putchar = 0x55;
char *send = "Changes to the clock of the C55x Subsystem Clock Group affect the clock of the External Memory Interface Clock Group. ";
int i = 0;
char control = '1';

CSL_init();
//调用任何CSL模块API之前都要使用的语句

UART_setup(
&Params);
initialMyUART();

retFlag
= UART_fputc(putchar,0);
if(retFlag){
printf(
"putchar correct\n");
}

/*
// printf("%s",send);
for(; i < 5; i++){
retFlag = UART_write(send,strlen(send),0);
if(retFlag){
printf("UART write Correct!\n");
}
}
*/

/*
printf("输入0继续循环,其他数停止循环");
scanf("%d",control);
while(control != '0'){
printf("输入0继续循环,其他数停止循环");
scanf("%c",control);
}

// sleep(50);
*/
while(1){}
//测试工程是否正确建立
//printf("hello world\n");
}

---------

2011.7.21

增加PLL的设置以后就可以了。

PLL_setFreq(PLL_PLLCSR_PLLEN_BYPASS_MODE,2,0,0,0,0,0);/*1,4,0,3,3,3,1*/

UART发送数据乱码的问题解决。

现在又出现了接收数据时,无法产生中断的问题。

posted @ 2011-07-15 13:25  elar  阅读(1286)  评论(1编辑  收藏  举报