泰凌微 蓝牙芯片tlsr8208 使用指北(二)
这里是写关于我遇到的问题 也许能帮助到其他初次接触的人。
使用指北第二篇 问题篇
这里是写关于我遇到的问题 也许能帮助到其他初次接触的人
问题1 泰凌微透传发数据吞一个字节的问题
我用他的程序进行透传任务,发现他的包头是8位的,但是提供的sdk手册是说明了7位,接受到的数据位是向后移动了一位 最后一位数据直接被抛弃掉了 这个问题我排查了很久 也去询问他们官方的人 提供过一个解决方法 我先说这个方法 还有别的奇思妙想继续看
提供的方法是在spp.c的文件夹里面 找到spp_send_data这个函数 去修改他
int spp_send_data (u32 header, spp_event_t * pEvt)
{
u8 *p = my_fifo_wptr (&spp_tx_fifo);
if (!p || (pEvt->paramLen+4) >= spp_tx_fifo.size)
{
return -1;
}
#if (BLE_MODULE_INDICATE_DATA_TO_MCU)
if(!module_uart_data_flg){ //UART idle, new data is sent
GPIO_WAKEUP_MCU_HIGH; //Notify MCU that there is data here
module_wakeup_module_tick = clock_time() | 1;
module_uart_data_flg = 1;
}
#endif
int sppEvt_len = pEvt->paramLen + 2; //修改为3
if (header & HCI_FLAG_EVENT_TLK_MODULE)
{
*p++ = sppEvt_len;
*p++ = sppEvt_len >> 8;
#if 1
memcpy (p, (u8 *)pEvt, pEvt->paramLen + 2); //修改为3
p += pEvt->paramLen + 2; //修改为3
#else
*p++ = pEvt->token;
*p++ = pEvt->paramLen;
*p++ = pEvt->eventId;
*p++ = pEvt->eventId>>8;
if(pEvt->paramLen - 2 > 0){
memcpy (p, pEvt->param, pEvt->paramLen - 2);
p += pEvt->paramLen - 2;
}
#endif
}
my_fifo_next (&spp_tx_fifo);
return 0;
}
这个方法是通过串口打印把数据的位置往后移1位 然后打印也会往后加1位,虽然是很取巧 但是如果不是同一个sdk编写的代码会因为头长度不统一导致通讯异常的问题 真正的解法是这样的
左图是官方提供的 sdk程序版本号是tc_ble_simple_sdk_B80_V3.4.2.1_P10这个sdk
右图是之前开发使用的老版本sdk!!!
发现问题了吗?
数据长度从一个字节变为二个字节!
就是这里导致的数据问题 这个数据长度调整到两字节 他发一次能发超过255个字节嘛 我笑死 官方也没说这里更改 找问题找的头大 服了服了
具体文件看下图 注意需要把u16修改为u8 这样就不需要官方给的解决方法 完美解决包头发8个的问题
问题2 串口和调试debug口冲突问题
因为我使用的硬件上是使用了串口 其中的tx和debug口的pin是同一个 本来想的是都是tx发送端 共用了应该是没问题的,但没想到实际操作中是出现问题的 不能共同使用 如果开了debug口再去初始化串口的话 程序会卡死在pin教初始化的函数
我的解决方法是直接检测全局定义去开关
/**
* @brief This function serves to select pin for UART module.
* @param[in] tx_pin - the pin to send data.
* @param[in] rx_pin - the pin to receive data.
* @return none
*/
void uart_gpio_set(GPIO_PinTypeDef tx_pin,GPIO_PinTypeDef rx_pin)
{
#if DEBUG_MODE==0
uart_set_pin_mux(tx_pin,(tx_pin != GPIO_PA2) ? UART_TX:1);
#endif
uart_set_pin_mux(rx_pin,(rx_pin != GPIO_PA1) ? UART_RX_I:1);
}
当然这是我最开始的时候写的 后面有优化过这里的想法 我懒得搬了 就这样先
问题3
关于打印的问题
泰凌微的打印printf是使用的debug功能去调用的 如果不开debug printf会指向一个空的打印函数 则什么都不会发送
但是我想使用printf的功能发现复写到自己的串口有点复杂没时间去理解 研究 主要是这种国产的芯片资料少 网上的教程也少 很麻烦 而且又和stm32不一样 所以我用了个别的方法
刚开始的打印调试可以去开debug口 他是一个软件模拟的tx串口 所以只需要加一个串口连接地和rx两个脚相连就行
具体的开启方式在drivers/printf.h里面 他有串口和usb调试 一般都是用串口
*******************************************************************************************************/
#include "gpio.h"
#pragma once
#define DEBUG_MODE 1
#if(DEBUG_MODE==1)
#define DEBUG_IO 1
#define DEBUG_USB 2
#define DEBUG_BUS 1
#if(DEBUG_BUS==DEBUG_IO)
#define PRINT_BAUD_RATE 115200 //1M baud rate,should Not bigger than 1Mb/s
#define DEBUG_INFO_TX_PIN GPIO_PB5
#define TX_PIN_GPIO_EN() gpio_set_func(DEBUG_INFO_TX_PIN , AS_GPIO);
#define TX_PIN_PULLUP_1M() gpio_setup_up_down_resistor(DEBUG_INFO_TX_PIN, PM_PIN_PULLUP_1M);
#define TX_PIN_OUTPUT_EN() gpio_set_output_en(DEBUG_INFO_TX_PIN,1)
#if (MCU_CORE_B80)
#define TX_PIN_OUTPUT_REG (0x503+((DEBUG_INFO_TX_PIN>>8)<<3))
#elif (MCU_CORE_B80B)
#define TX_PIN_OUTPUT_REG reg_gpio_out_set_clear(DEBUG_INFO_TX_PIN)
#endif
#endif
通过修改宏定义去调整 这里的debug口是PB5 可以根据用户的板子引出的引脚去修改 当然 如果不复用最好 就不会出现卡死的问题 不过这里也给一个解决办法
关于我的串口程序
综上所述我的串口想使用打印的功能去调试 我只能通过自己的方式去修改 可以给大家参考一下
但是master模式下的例程是没有串口的 需要用户去添加 后续文章告诉你们在哪里添加
void debug_uart(char *data)
{
uart_data_t uart_tx_buf;
u16 len = 0;
char *original_data = data;
while(*data != '\0')
{
len++;
data++;
}
printf("len = %d",len);
uart_tx_buf.len = len;
for(u8 i = 0;i < uart_tx_buf.len;i++)
{
uart_tx_buf.data[i] = original_data[i];
}
uart_send_dma((unsigned char*) (&uart_tx_buf));
sleep_ms(5);
if (Tr_isUartTxDone()) {
memset(uart_tx_buf.data,0,uart_tx_buf.len);
}
}
暂时先想到这些问题 后续遇到什么问题再说吧
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)