zoukankan      html  css  js  c++  java
  • 使用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发送数据乱码的问题解决。

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

  • 相关阅读:
    洛谷 U138347 贩卖武器
    洛谷 U138346 统治王国
    小技巧—对树中叶子节点的记录
    洛谷 U138345 太极棋
    洛谷 U138343 炼金术士
    CF1038C Gambling
    CF1037A Packets
    如何看待神&#183;QYB自创算法爆锤成名已久的计算机科学家Robert&#183;Tarjan
    浅谈拓扑排序和元素间依赖性
    NOIP 2013 车站分级
  • 原文地址:https://www.cnblogs.com/elaron/p/2107302.html
Copyright © 2011-2022 走看看