[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
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
蓝牙适配器就是在面对面传输中的工具,也就是指一些电子产品适用设备的接口转换器,现在的蓝牙适配器都是可以在全球通用的,是一个短距离的无线连接技术。支持3.5mm音频模拟输入、支持SPDIF光纤输入。该方案支持接收方进行AVRCP、HFP等音量加减、上下曲的控制、电话接听\挂断的控制,支持USB接口可连接在电视,电脑,手机,音响,功放等设备上使用,实现无线传输。采用CSR8675蓝牙芯片,搭载新版蓝牙4.2,传输更稳定,信号更强劲,蓝牙发射/接收无压力。内置天线,支持10M远距离传输,客厅房间无死角连接。 【方案优势】 1、该方案支持蓝牙发射(TX)和接收(RX)两用一体,目前只有CSR8675CSR8670芯片才支持SOURCE工程,这是无法使用其他芯片替换的(包括最近新推出的QCC512X芯片)。 2、具市场分析,该方案目前在市场上的销量是十分乐观的。 3、CSR675芯片的稳定性高。 4、该方案是支持APTX认证、CD级的音质、听歌无延时。 5、该方案在音频上支持APTX、Faststream、AAC、SBC、MP3编解码处理能力。 【软体、硬体优势】 1、CSR8675芯片无需外接FLASH,在模块布局上和价格上还是有独自的优势。 2、CSR8675支持80 MHz RISC MCU and 120 MHz Kalimba DSP,处理能力强,支持UART、I2C、I2S多个外围接口,客户可以在ADK上随意添加自己的功能; 3、该方案接收灵敏度测试可以达到-93db; 4、目前软件最新版本为ADK4.3.1,支持BT5.0协议,在传输距离和功耗上都有所改进; 5、该方案软体上整合了SINK和SOURCE工程的功能,经过一系列的测试,排除了多方面的BUG,这也是很多中小型企业无法做到的瓶颈之处。 6、该方案我们修改DSP source,调整了底部噪音的mute值,提高了音质效果; 7、该方案软在体上做到了RX、TX的切换无需RESET操作,可以通过开关直接切换; 8、软件上做到了支持SPDIF和AUX自由切换,音质上不会出现任何卡顿; 方案来源于大大通
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值