dsp6657的串口學習


1. 打算用dsp6657學習下,先用串口實驗吧。找一下芯片支持庫Chip support libraries,路徑D:\ti\pdk_C6657_1_1_1_4\packages\ti\csl,新建工程

2. 進入這個目錄沒找到串口的C庫文件?只能去其他工程看下為啥了。確實沒有,其他工程用的是這兩個初始化的

1 platform_uart_init();
2 platform_uart_set_baudrate(19200);

3. DSP6657有2個串口,支持流控可選

4. 搞定頭文件的路徑,還有庫的路徑D:\ti\pdk_C6657_1_1_1_4\packages\ti\platform\evmc6657l\platform_lib\lib\debug\ti.platform.evm6657l.lite.lib,現在很想知道怎么修改成相對路徑,寫了一個簡單的程序,先測試一下

 1 #include "cslr_uart.h"
 2 //估計導入包之后就可以直接使用包含的路徑了
 3 #include "ti/platform/platform.h"
 4 
 5 //#define  PLATFORM_WRITE_IN  1
 6 void delay(int j)
 7 {
 8   int i = 50000;
 9   while(j--)
10   {
11       int i = 50000;
12       while(i--);
13   }
14 }
15 void main()
16 {
17     int i;
18     platform_init_flags  sFlags;
19     platform_init_config sConfig;
20     /* Status of the call to initialize the platform */
21     Int32 pform_status;
22     /* Platform Information - we will read it form the Platform Library */
23     platform_info       sPlatformInfo;
24 
25     /*
26      * You can choose what to initialize on the platform by setting the following
27      * flags. We will initialize everything.
28     */
29     memset( (void *) &sFlags,  0, sizeof(platform_init_flags));
30     memset( (void *) &sConfig, 0, sizeof(platform_init_config));
31 
32     sFlags.pll = 0;
33     sFlags.ddr = 0;
34     sFlags.tcsl = 0;    /* Time stamp counter   */
35     sFlags.phy  = 0;    /* Ethernet                     */
36     sFlags.ecc = 0;
37 
38     sConfig.pllm = 0;
39 
40     pform_status = platform_init(&sFlags, &sConfig);
41     if (pform_status == Platform_EOK) {
42             /* Get information about the platform so we can use it in various places */
43             memset( (void *) &sPlatformInfo, 0, sizeof(platform_info));
44             (void) platform_get_info(&sPlatformInfo);
45     }
46 
47     platform_uart_init();
48     platform_uart_set_baudrate(19200);
49     //串口初始化
50     //打印一段
51     while(1)
52     {
53 
54         platform_uart_write(0x55);
55         (void) platform_led(1, PLATFORM_LED_ON, (LED_CLASS_E) PLATFORM_USER_LED_CLASS);
56         delay(50);
57         (void) platform_led(1, PLATFORM_LED_OFF, (LED_CLASS_E) PLATFORM_USER_LED_CLASS);
58         delay(50);
59     }
60 }

5. 估計是沒有cmd文件,所以load下載程序的時候失敗了。不過奇怪的是,其他的6657工程沒有CMD文件。C665x DSP 集成了大量的片上存儲器。除了 32KB 的 L1 程序和數據高速緩存區,每核配有 1024KB 專用存儲器,可配置為可映射 RAM 或緩存。該器件還集成了 1024KB 的多核共享存儲器,可以作為一個共享 L2 SRAM或共享的 L3 的 SRAM。所有的 L2 存儲器具有檢錯和糾錯能力。這次寫到L1空間試一下。如果要觸發core1運行,應該還需要在core0運行起來后,由core0向core1寫IPC觸發。

6. 建立一個CMD文件測試一下

 1 /*
 2  *  Linker command file
 3  *
 4  */
 5 
 6 -c
 7 -heap  0x41000
 8 -stack 0xa000
 9 
10 /* Memory Map 1 - the default */
11 MEMORY
12 {
13     L1PSRAM (RWX)  : org = 0x0E00000, len = 0x7FFF
14     L1DSRAM (RWX)  : org = 0x0F00000, len = 0x7FFF
15 
16     L2SRAM (RWX)   : org = 0x0800000, len = 0x080000
17     MSMCSRAM (RWX) : org = 0xc000000, len = 0x100000
18     DDR3 (RWX)     : org = 0x80000000,len = 0x20000000
19 }
20 
21 SECTIONS
22 {
23     .csl_vect   >       L2SRAM
24     .text       >       L2SRAM
25     GROUP (NEAR_DP)
26     {
27     .neardata
28     .rodata
29     .bss
30     } load > L2SRAM
31     .stack      >       L2SRAM
32     .cinit      >       L2SRAM
33     .cio        >       L2SRAM
34     .const      >       L2SRAM
35     .data       >       L2SRAM
36     .switch     >       L2SRAM
37     .sysmem     >       L2SRAM
38     .far        >       L2SRAM
39     .testMem    >       L2SRAM
40     .fardata    >       L2SRAM
41     platform_lib >         L2SRAM
42 }

7. 仿真測試的時候發現LED燈會閃爍,但是串口的數據不對,懷疑是時鍾的配置不對

8. 測試的時候以為是CFG文件的問題,就添加了一個CFG文件(添加的時候,CCS會提示是否需要把RTSC添加進工程,我添加了),沒什么用處,刪掉CFG文件,但是CCS提示RTSC需要一個.cfg文件,看樣子還需要把RTSC也刪除。搞不定,重新建了個工程,把之前的C文件和CMD文件拷貝進來。

9. 串口波特率不對頭,估計是系統時鍾配置的問題,那么沒辦法只能用邏輯分析儀抓包看一下,其實每次是有數據的,因為之前把波特率調低有亂碼數據。下圖是RS232的波形,每個位是520.5us,用1000000/520.5 = 1923波特率。

10. 看下串口收到的數據,正確了,接下來需要研究下DSP6657的時鍾配置函數了。

11. 看下波特率配置函數,時鍾源是PLATFORM_UART_INPUT_CLOCK_RATE,不過系統時鍾不對頭,比較麻煩。

1 Platform_STATUS platform_uart_set_baudrate(uint32_t baudrate) {
2     uint16_t brate;
3     IFPRINT(platform_write("platform_uart_set_baudrate(baudrate=%d) called \n", baudrate));
4     brate = ((Uint16) (PLATFORM_UART_INPUT_CLOCK_RATE/(baudrate * 16)));
5     UartSetBaudRate(brate);
6     return Platform_EOK;
7 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM