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

由于要使用5502的UART口与FT2232H的UART口进行通信,因此先用CSL对UART口进行编程测试。
在测试过程中发现,5502的UART口可以与FT2232H的UART连接上,但是FT2232H收到的数据全是乱码。
代码如下:
使用5502自带的UART口发送数据乱码的问题
文章图片
使用5502自带的UART口发送数据乱码的问题
文章图片
View Code

#include
#include
#include
#include

#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来解决,而不是修改结构体的参数为默认值)。
最新的代码更新如下:

使用5502自带的UART口发送数据乱码的问题
文章图片
使用5502自带的UART口发送数据乱码的问题
文章图片
View Code
#include
#include
#include
#include
#include

#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发送数据乱码的问题解决。
现在又出现了接收数据时,无法产生中断的问题。
【使用5502自带的UART口发送数据乱码的问题】转载于:https://www.cnblogs.com/elaron/archive/2011/07/15/2107302.html

    推荐阅读