使用5502自带的UART口发送数据乱码的问题
由于要使用5502的UART口与FT2232H的UART口进行通信,因此先用CSL对UART口进行编程测试。
在测试过程中发现,5502的UART口可以与FT2232H的UART连接上,但是FT2232H收到的数据全是乱码。
代码如下:
#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来解决,而不是修改结构体的参数为默认值)。
最新的代码更新如下:
#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发送数据乱码的问题解决。
现在又出现了接收数据时,无法产生中断的问题。