Error: dbg.M0015 on BLE Pioneer Kit
作者 codercjg 在 29 六月 2016, 11:14 上午
想要調試PSoC_4_BLE_CapSense_Slider_LED工程時,彈出Error: dbg.M0015 錯誤。
現象:錯誤信息為Debugger exited unexpectedly during run. Encountered error (Target disconnected See output window for more information.)
原因:為了降低功耗,關閉了SWD調試功能
解決辦法:
在文件PSoC_4_BLE_CapSense_Slider_LED.cydwr中system=>Programming\Debugging=>Debug Select把GPIO方式換成SWD方式重新編譯
lwip tcp反復斷開和重連時出現的bug
作者 codercjg 在 7 六月 2016, 5:17 下午
LWIP做TCP Client時,綁定了端口號tcp_bind(pcb, IP_ADDR_ANY, TCP_PORT);
當PC TCP Server主動斷開TCP連接時,TCP Client會不斷重連。反復斷開和重連后發現,連接上后一會又自動斷開了。
通過wireshark抓包發現是PC 主動斷開了連接。
后來通過命令行里netstat -an 查看端口連接狀態,發現竟然有兩個ip連接該端口,一個狀態為SYN_RECEIVED, 另一個為ESTABLISHED。
實際上,客戶端只有一個IP。如圖端口號為56665所示:

后來tcp client去掉tcp_bind(pcb, IP_ADDR_ANY, TCP_PORT)不綁定固定端口號, 并在重新連接前取消之前的連接tcp_abandon(TcpPCB, 1);
這樣解決了這個bug。
/* try connect the server periodically when connection lost /
void Connect_Periodic_Handle(__IO uint32_t localTime)
{
static uint8_t tryTimes = 0;
if(!connected) {
if(tryTimes > 4) {
tcp_abandon(TcpPCB, 1); / reset tcp client, fixup the bug (only send tcp SYN 6 times) of lwip /
mdelay(100);
Tcp_Client_Init();
tryTimes = 0;
return;
}
/ connect periodic process every 250 ms */
if (localTime – connectTimer >= CONNECT_TMR_INTERVAL) {
connectTimer = localTime;
tcp_connect(TcpPCB, &serveraddr, TCP_PORT, tcp_client_connected);
tryTimes++;
}
}
}
void Tcp_Client_Init(void)
{
struct tcp_pcb pcb;
/ Create a new TCP control block /
pcb = tcp_new();
TcpPCB = pcb;
/ Assign to the new pcb a local IP address and a port number /
/ tcp_bind(pcb, IP_ADDR_ANY, TCP_PORT); / / bug fix /
if(equipmentInfo.dhcp == 0 && equipmentInfo.netSetting.serverIP != 0xFFFFFFFF) {
serveraddr.addr = equipmentInfo.netSetting.serverIP;
} else { / default ip /
IP4_ADDR(&serveraddr, 192, 168, 1, 200);
}
tcp_recv(pcb, tcp_client_recv);
/ Connect to the server: send the SYN */
tcp_connect(pcb, &serveraddr, TCP_PORT, tcp_client_connected);
tcp_err(pcb, tcp_error);
}
ATSAMB11-Xplained-Pro ble藍牙4.1開發板
作者 codercjg 在 3 六月 2016, 3:47 下午
ATMEL 的smab11支持低功耗藍牙ble4.1,既可作central,又可做peripheral。
官網說支持MDK編程,我試了下bug一大堆,動不動就跑飛,后來只好用官方的ATMEL studio。
板子比較新,用的人少,網上相關討論很少。主要通過官方開發板文檔和例子源碼,熟悉ble藍牙程序編程模型。
最快的方法就是在板子上和手機上跑例子,看效果,然后根據需要修改代碼,實現自己的功能。
這個過程會發現許多問題。
串行發送和接收數據的例子:CUSTOM_SERIAL_CHAT_SAMB11_XPLAINED_PRO1
血壓計例子:BLOOD_PRESSURE_SAMB11_XPLAINED_PRO1
通過測試發現上行速率最大為7kb/s,下行速率最大為1kb/s。連接間隔對傳輸速率影響很大,通信距離能達到20米,但速率會因為距離變遠而減小
- at_ble_api.h中
Characteristic權限設置:
define AT_BLE_CHAR_BROADCST (1 << 0)
define AT_BLE_CHAR_READ (1 << 1)
define AT_BLE_CHAR_WRITE_WITHOUT_RESPONSE (1 << 2)
define AT_BLE_CHAR_WRITE (1 << 3)
define AT_BLE_CHAR_NOTIFY (1 << 4)
define AT_BLE_CHAR_INDICATE (1 << 5)
define AT_BLE_CHAR_SIGNED_WRITE (1 << 6)
define AT_BLE_CHAR_RELIABLE_WRITE (1 << 7)
define AT_BLE_CHAR_WRITEABLE_AUX
當設為AT_BLE_CHAR_NOTIFY和AT_BLE_CHAR_WRITE_WITHOUT_RESPONSE 速度最快,因為不需要權限驗證。
- ble_manager.h中修改連接間隔
define GAP_CONN_INTERVAL_MIN (8)// 6//(20) //Connection interval min 20ms
/** maximum connection interval */
// <o> GAP Maximum Connection Interval in msec <0-1000:50>
// <i> Defines Maximum interval for GAP Connection.
// <i> Default: 40
// <id> gap_conn_interval_max
define GAP_CONN_INTERVAL_MAX (15)//10 //(40) //Connection interval max 40ms
/** connection slave latency */
// <o> GAP Slave Latency <0-4>
// <i> Defines Slave Latency for GAP Connection.
// <i> Default: 0
// <id> gap_conn_slave_latency
define GAP_CONN_SLAVE_LATENCY (0)
/** minimum length of local info parameters when using connection establishment proc */
define GAP_CE_LEN_MIN (0)
/** maximum length of local info parameters when using connection establishment proc */
define GAP_CE_LEN_MAX (0)
/** supervision time-out */
// <o> GAT Super Vison Timeout in msec <0-3000:50>
// <i> Defines SuperVision Timeout for GAP Connection.
// <i> Default: 0x1f4
// <id> gap_supervision_timout
define GAP_SUPERVISION_TIMOUT (0x1f4) // 500 for supervision time-out
當GAP_CONN_INTERVAL_MAX很小時,發送數據過快可能會導致程序跑飛,因為協議棧不開源,沒法調試,只能把這個間隔減小
3.自帶的adc例子源碼有問題,當和ble藍牙協議棧整合時
函數adc_init()中 AON_GP_REGS0->RF_PMU_REGS_1.reg = reg_value;
這一句會改寫藍牙相關的內容,導致藍牙通信不正常,應該改為AON_GP_REGS0->RF_PMU_REGS_1.reg = AON_GP_REGS0->RF_PMU_REGS_1.reg | reg_value;
這個板子其實挺坑的,沒有編程手冊,沒有寄存器手冊,沒有協議棧源碼,不好調試啊。