[CSR8] 分享一個CSR8670串列埠收發程式 [複製連結]
chuck_pz
暫無簽到資料
電梯直達樓主
發表於 2015-2-5 16:06:07 | 只看該作者
馬上註冊,享用更多功能,讓你輕鬆玩轉社群。
您需要 登入 才可以下載或檢視,沒有帳號?立即註冊
x
本帖最後由 chuck_pz 於 2015-2-5 17:00 編輯
最近在除錯csr8670串列埠收發程式,為了方便大家使用,下面就介紹下怎麼使用8670的串列埠。
介紹前,先吐槽下CSR,也許是以前沒用過CSR晶片,尼瑪資料太少了。
使用uart的步驟:
1.工程屬性中將Transport改為raw ,還需確認mak中的Transport也為raw
CS-207483-UGP8ImplementingStreamsinBlueCoreApplications.pdf文件裡面有介紹serial port型別就是raw。
2.在工程中加入以下程式碼
#define uart_RECV_BUF_SIZE 20
static TaskData uart;
static uint8 uartl_recv_buf[UART_RECV_BUF_SIZE];
void uart_init(void)
{
uart.handler = uart_handler;
StreamConfigure(VM_STREAM_UART_CONFIG, VM_STREAM_UART_THROUGHPUT);
StreamUartConfigure(VM_UART_RATE_115K2,VM_UART_STOP_ONE,VM_UART_PARITY_NONE);
MessageSinkTask(StreamUartSink(), &uart);
}
void uart_send(uint8 *buf, uint16 len)
{
uint16 offset;
uint8 *dest;
/*get the sink for the uart, panic if not available*/
Sink sink = StreamUartSink();
PanicNull(sink);
/*claim space in the sink, getting the offset to it*/
offset = SinkClaim(sink, len);
if(offset == 0xFFFF) Panic(); /*space not available*/
/*Map the sink into memory space*/
dest = SinkMap(sink);
(void) PanicNull(dest);
/*copy the string into the claimed space*/
memcpy(dest + offset, buf, len);
/*Flush the data out to the uart*/
PanicZero(SinkFlush(sink, len));
}
static void uart_recv(void)
{
Source src;
uint8 size, i;
uint8 *buf;
/*get the uart source header*/
src = StreamUartSource();
size = SourceSize(src);
buf = (uint8 *)SourceMap(src);
if(size > UART_RECV_BUF_SIZE)
{
SourceDrop(src, size);
return;
}
memcpy(uart_recv_buf, buf, size);
SourceDrop(src, size);
}
static void uart_handler(Task task, MessageId id, Message message)
{
switch(id)
{
case MESSAGE_MORE_DATA:
uart_recv();
break;
default:
break;
}
}
3.在pstool中設定host_interface為VM access to the uart,實際根據需要去選擇,這裡我選VM access to the uart。
4.在pstool中設定uart configuration when under VM control為0880,這裡我選擇不需要流控制,實際根據需要去設定。
不過在實際測試中,只要接收的資料大於2,都會分包接收,搞得很蛋疼,也許是因為沒有使用流控制的原因,所以實際使用中最好加入流控制,方便接收。但想想為什麼沒有流控制的時候會分包呢?開始以為message訊息中會有接收成功的標誌,不過測試了一番發現沒有!!!猜想可能是csr 的OS原因引起的,估計是中斷接收到串列埠資料了,會先發一個包過去告訴Task有資料過來,去接收,但並沒有全部把資料發過來,這樣做可能是想及時響應中斷的緣故。大家知道中斷程式儘量少做事,以免引起阻塞,於是將剩下的資料等到OS空閒的時候再傳送過來告訴Task去讀取,不過沒法去求證,希望大神解答。
- 本文出自藍芽音響網,原文地址:http://www.btspeaker.cn/thread-5051-1-1.html
相關文章
- 隨機連結串列的複製隨機
- 面試題35:複雜連結串列的複製面試題
- 「複製帶隨機指標的連結串列」的一個很巧妙解法隨機指標
- [連結串列]leetcode138-複製帶隨即指標的連結串列LeetCode指標
- 複製帶隨機指標的連結串列隨機指標
- Uart進行的串列埠收發串列埠
- 【連結串列問題】打卡8:複製含有隨機指標節點的連結串列隨機指標
- 串列埠收發UART(Verilog HDL)串列埠
- 串列埠收發字元轉換為整數串列埠字元
- LeetCode 複製帶隨機指標的連結串列LeetCode隨機指標
- ZeroClipboard 多個複製按鈕,多個複製連結 實現方式
- Linux 串列埠程式設計 串列埠裝置程式開發Linux串列埠程式設計
- 連結串列面試題(九)---判斷一個連結串列是否帶環面試題
- 一個統一的連結串列結構 (轉)
- 單連結串列複製你已經會了,如果我們再加個指標...指標
- Linux串列埠程式收發16進位制資料錯誤Linux串列埠
- 連結串列的作用和好處?如何用JS來寫一個連結串列JS
- 連結串列面試題(一)---刪除一個無頭單連結串列的非尾結點面試題
- 複雜連結串列的賦值賦值
- 從連結串列出發封裝一個自己的工具封裝
- LeetCode-138-複製帶隨機指標的連結串列LeetCode隨機指標
- 基於Atmega8微控制器的串列埠收發程式串列埠
- 在Java中操作串列埠實現簡訊收發Java串列埠
- 連結串列面試題(七)---合併兩個有序連結串列面試題
- gdbserver連線Ubuntu除錯程式(使用串列埠)ServerUbuntu除錯串列埠
- 連結串列-雙向連結串列
- 連結串列-迴圈連結串列
- 【LeetCode】【連結串列】劍指 Offer 52. 兩個連結串列的第一個公共節點 思路解析和程式碼LeetCode
- 演算法題:反轉一個單連結串列&判斷連結串列是否有環演算法
- 連結串列面試題(二)---連結串列逆序(連結串列反轉)面試題
- LED發光二極體,串列埠收發資料、按鍵控制串列埠
- js實現複製連結JS
- 【程式碼隨想錄】二、連結串列:2、設計連結串列
- 【程式碼隨想錄】二、連結串列:1、移除連結串列元素
- 定義一個函式,輸入一個連結串列的頭節點,反轉該連結串列並輸出反轉後連結串列的頭節點函式
- (分享連結製作)防封,微信文章分享活動推廣連結製作
- 連結串列4: 迴圈連結串列
- 連結串列-單連結串列實現