制作开发套件董事会的问题

8 posts / 0 new
最后一篇
温康尔
离线
最后一次露面:4 years 5 months ago
加入:2016-06-23 13:01
制作开发套件董事会的问题

嗨对话框,

I am trying to write a firmware that makes the development kit board (basic) a dongle.
我已经写了一个桌面软件,将通过串口与板通信。
I hope that when the software sends commands to the board, the board could response accordingly. e.g. scan peer devices, connected to peer devices , etc. The firmware installed in the board could also discover the services and attributions of the peer device it connects to, and report these to the software on PC via serial port. It could also receive the notify data from the connected peer device and , again, report to the PC software.
我已经阅读了DSP示例,但它发现了对等设备并通过设备名称连接到给定的设备(在代码中预先给出!!!!)。所以你会帮我一个忙,为我写一个指导线吗?谢谢!

And I tried to modify the code in user_sps_host.c, the user_on_adv_report_ind function is modified as follows, and I also modified the user_on_scanning_completed function, in the purpose to stop scanning when obtained 5 devices.

void user_on_adv_report_ind(struct gapm_adv_report_ind const * param)
{
//获取设备名称
uint8 i = 0,j = 0;
uint8 len = sizeof(param-> report.data);
char dn [20] =“”;
for(i = 0; ireport.data [i]> = 0x20 && param-> report.data [i] <= 0x7e)
{
dn [j ++] = param-> report.data [i];
}
}
//获取设备地址
len = sizeof(param-> report.addr.addr);
char add_buffer[13]="";
j = 0;
for(i = 0; ireport.adv_addr.addr [len - i - 1]);
add_buffer [j] =缓冲器[0];
add_buffer [j + 1] =缓冲器[1];
j = j + 2;
}
//获得rssi.
char rssi[3];
Sprintf(RSSI,“%D”,Param-> Report.RSSI);
//形成通过UART2发送到PC的数据包
char packet[44];
j = 0;
数据包[j ++] ='*';
数据包[j ++] ='d';
数据包[j ++] ='n';
packet[j++] = ':';
for(i=0; i<20; i++)
{
if(dn[i] != 0x00)
{
packet[j++] = dn[i];
}
}
数据包[j ++] =',';
for(i = 0; i <13; i ++)
{
if(add_buffer [i]!= 0x00)
{
数据包[j ++] = add_buffer [i];
}
}
数据包[j ++] =',';
for(i = 0; I <3; I ++)
{
if(add_buffer [i]!= 0x00)
{
数据包[j ++] = add_buffer [i];
}
}
数据包[j ++] ='\ r';
数据包[j ++] ='\ n';
// send the packet to the PC
printf_string(数据包);

}

void user_on_scanning_completed (uint8_t status)
{
device_count ++;
if(device_count <= 5)
{
user_scan_start();
}
别的
{
user_wait_for_cmd();
}
返回;
}

这里,我添加了一个名为user_wait_for_cmd()的函数,该函数用于读取命令,并且如下实现,并且UART2读取完成的回调用于调用user_wait_for_cmd()。但是,该程序提出了JLINK错误,表示CPU正在运行时无法读取寄存器##。这项实施有什么问题?

void user_wait_for_cmd(void)
{
uint8_t read_length = 25;
while(!read_success)
{
UART2_READ((UINT8_T *)缓冲区,READ_LENGTH,UART2_READ_COMPLETION_CB);
}
}

BOOL READ_SUCCESS;
void uart2_read_completion_cb(uint8_t status)
{
if(缓冲区[0] =='c'&& buffer [1] =='m'&& buffer [2] =='d')
{
read_success = true;
printf_string(buffer);
}
别的
{
read_success = false;
user_wait_for_cmd();
}
}

顺便问一下,我可以在哪里买一个DA14580的加密狗?

关键词:
Device:
mt_dialog.
离线
最后一次露面:3个月5天前
职员
加入:2015-06-08 11:34
嗨wenkangl,

嗨wenkangl,

据我所知,它与Pro-Dev套件一起,我不认为这是一个单独出售的。关于您粘贴的代码的一些评论,我可以看到您正在计算在调用user_on_scanning_completed()时发现的设备,这意味着您正在计算设备的扫描周期,每个扫描周期持续几秒钟当您取消扫描过程或扫描操作完成时,请调用user_on_scanning_Complete。广告消息每当设备获取新的广告字符串时都会向user_on_adv_report_ind()表示指示。因此,为了计算扫描设备,您必须做的是检查当前广告字符串的BD地址并检查日志中的条目(您保留录制的设备的位置)并在放置新条目时计算在您的日志中。关于应用代码进行读取时的错误,我不认为您的实现对其负责,请检查设备的默认休眠模式,并确保禁用睡眠模式(您不能启用睡眠模式并在同一时间调试)。此外,您还必须考虑580当它睡觉时,所有外围设备都被断电,包括UART,例如,DSP使用流量控制方案,以便在其允许发送数据时发信号通知外部MCU,自从第580次睡眠时发送数据以来,他们将丢失。

谢谢mt_dialog.

温康尔
离线
最后一次露面:4 years 5 months ago
加入:2016-06-23 13:01
谢谢MT,但我的目标不是

谢谢mt,

我对这一主题有更多的问题,因为我的目标不仅仅是在附近计算设备。

no1。在da1458x_config_basic.h中,睡眠模式已被配置为活动:

#undef CFG_MEM_MAP_EXT_SLEEP
#undef cfg_mem_map_deep_sleep.

然后我向DB发送了扫描命令(cmd_scan),固件确实调用user_scan_start()并运行函数到结尾。但是,在此之后,user_on_adv_report_ind未触发,而且,当我发送了连接命令(cmd_connect)时,程序名为user_connect_to但user_on_scanning_completed和user_on_connection的程序未触发......所以在这种情况下,我的错误执行。

I have modified the function uart2_read_completion_cb as follows
Char Buffer [25];
静态UINT8_T UART2_READ_IN_POGRONGER = 0;

void uart2_read_completion_cb(uint8_t status)
{
if(缓冲区[0] =='c'&& buffer [1] =='m'&& buffer [2] =='d')
{
uart2_read_in_progress = 0;
printf_string(buffer);
action_on_command();
}
别的
{
user_wait_for_cmd();
}
}

void user_wait_for_cmd(void)
{
uint8_t read_length = 25;
uart2_read_in_progress = 1;
UART2_READ((UINT8_T *)缓冲区,READ_LENGTH,UART2_READ_COMPLETION_CB);
而(UART2_READ_IN_POGRONGER);
}
收到命令的行动如下
void action_on_command(void)
{
char cmdid [] = {buffer [4],缓冲区[5]};
uint8 CMD_ID = (uint8)strtol(cmdid,NULL,16);
uint8 hexdata [16] = {0};
uint8 i = 7;
while(!(buffer[i]=='\\' && buffer[i+1]=='r'))
{
hexdata [I-7] =缓冲器[i];
i++;
}
切换(CMD_ID)
{
case cmd_scan:
{
// 0x00
user_scan_start();
休息;
}
case cmd_connect:
{
// 0x01
uint8 peer_addr [6] = {0x00};
for(i = 0; i <6; i ++)
{
char temp[] = { hexdata[2*i],hexdata[2*i+1] };
uint8 part_add = (uint8)strtol(temp,NULL,16);
peer_addr[5-i] = part_add;
}
user_connect_to(0x00,peer_addr);
休息;
}
}
}
user_connect_to如下
void user_connect_to(uint8_t peer_addr_type, uint8_t *peer_addr)
{
app_easy_gap_start_connection_to_set(peer_addr_type,peer_addr,ms_to_doubleslots(user_con_intv));
app_easy_gap_start_connection_to();
}

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

no2。然后我想出了另一个想法。也就是说,即使我解决了上述问题,它仍然无法满足。因为我希望DA14580可以异步地处理至少两个任务,即它不断监视从PC发送的命令(并且DA14580应始终监视PC发送的命令),同时执行其他操作。
For example, it monitors the command from PC while receiving notified data sent by a connected peripheral device and send the data to the PC.
另一个例子:当DB接收到通知数据时,我向DB发送停止通知命令。DB应停止上传接收到的通知数据,并将停止通知命令发送到连接的外围设备,并且连接的外围设备将相应地进行。
For this purpose, what should I do if I want to use the DSPS project? ps: the question is focus on the central end (dongle), the task for the peripheral end has already been done. ^_^

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

no3。由于加密狗没有单独出售,您是否可以推荐一个适用于DA14580的人?ConnectBlue?

谢谢!

mt_dialog.
离线
最后一次露面:3个月5天前
职员
加入:2015-06-08 11:34
嗨wenkangl,

嗨wenkangl,

no1:您已更改的定义会影响设备的内存映射而不是睡眠模式(其在上面的注释中提到的“睡眠模式内存映射配置。”),更改您必须更改app_default_sleep_mode的默认休眠模式使用Arch_sleep_off的user_config.h文件,这是您在调试模式下几秒钟后jlink报告的错误的原因。关于user_on_adv_report_ind未触发的事实(我想通过使用断点来捕获广告指示),如果确实新的扫描程序已启动,则无法通过调试器以来的断点捕获该广告事件从您的580中取消附加。请检查上面,如果您已禁用休眠状态,并且当广告设备实际上是广告并可接受连接时,当您从UART发送相应的命令时调用适当的功能。

No3:从对话框提供的加密狗不是通用的加密狗,您可以连接到Windows机器并被识别为蓝牙模块,它只是一个580,带有Atmel微控制器,用作USB端口的桥梁,仅接受UART命令通过GTL(Propriale Protocol)。我怀疑一般的BLE模块是您想要的,虽然我无法提出建议,但我想支持支持4.0规范的任何BLE加密狗,但在我们使用的大多数应用程序(测试)中我们正在使用Android雷竞技安卓下载手机。

NO2: The DSPS example monitors the UART and serves the DSPS_TASK (send notifications and accept write commands from the central). When data are available in the UART an interrupt occurs the ISR is executed and the code takes care of the FIFO of the UART and handles the data properly, it doesn't poll the UART to consider this an additional task. You can study this implementation as an example.

谢谢mt_dialog.

温康尔
离线
最后一次露面:4 years 5 months ago
加入:2016-06-23 13:01
谢谢,山

谢谢,山

as for NO2, is the ISR you mentioned is UART2_Handler(void) in uart2.c and the DSPS_TASK for data received is uart2_rec_data_avail_isr? if so, where should I put the action_on_command() I defined ? do you mean that I should modify uart2_rec_data_avail_isr directly?

can you explain more on the DSPS_TASK ?

非常感谢!

温康尔
离线
最后一次露面:4 years 5 months ago
加入:2016-06-23 13:01
当我读完时

当我阅读代码,我发现art2_env.rx.callback is assigned in uart2_read, and when RECEIVED_AVAILABLE the uart2_rec_data_avail_isr() is executed and the defined callback is executed. and then in uart2_rec_data_avail_isr() the callback pointer will be cleared. if my understanding is right? if so, does it mean that I need to call uart2_read to get the command received, rather than I send a command on PC and the action_on_command() is called?

mt_dialog.
离线
最后一次露面:3个月5天前
职员
加入:2015-06-08 11:34
嗨wenkangl,

嗨wenkangl,

DSP和实现的脱胶机制使用不同的UART(580中有两个相同的UART模块),因此每个UART都有单独的ISR处理程序。如何处理您的中断和数据,这取决于您的应用程序以及您想要实现它的方式。关于DSPS_Task(Task_sps_server更加确切)是DSPS设备的配置文件任务,您可以在UM-B-038串行端口服务应用程序文档中找到更多信息。

是的,您的理解是正确的,在UART2获取数据上的数据后,您将清除回调,您只需调用UART2_READ()即可继续执行任何您正在做的事情,并且当您在UART中获取数据时,中断将继续进行中断,当您达到您的数据的大小时,您的回调(在调用UART读取时设置的一个)将被调用并通知您所指定的数据已到达,并且将禁用UART中断。这意味着如果您的命令具有指定大小,则可以在等待它时设置每个命令的大小,或者您可以指定将读取第一个字节作为命令大小的命令格式(读取一个字节为大小)和然后根据该特定大小命令设置回调,或者您可以始终等待一个字节并等待命令的终端字符(指示命令结束),有相当少的选项如何实现这一目标但是我在上面提到的,这取决于你希望如何实现的方式。

谢谢mt_dialog.

温康尔
离线
最后一次露面:4 years 5 months ago
加入:2016-06-23 13:01
谢谢mt,

谢谢mt,

因此要监视UART,我必须经常调用UART2_READ(),并且我的解决方案到数据包的大小是这样,我使用固定的长度分组(25如代码中所示),并且该命令将是预先的- 处理使其始终为25(在数据包的末尾添加0,因此它的长度为25)。我正试图得到中央工作。