⚠️
嗨,...感谢您来论坛。令人兴奋的消息!我们现在正在迁至我们的新论坛平台,将提供更好的功能,并包含在主对话框网站中。所有帖子和帐户都已迁移。我们现在只接受新论坛上的流量 - 请发布任何新线程https://www.dialog-seminile.com/support.。我们将在未来几天修复错误/优化搜索和标记。
9个帖子/ 0新
最后一篇
matthieuw.
离线
最后一次露面:7个月3周前
加入:2015-11-20 14:55
SPI延迟

我们在作为从设备运行的自定义板上实现了对话框DA14681。

我们的系统主要目的是在通过BLE SPS或USB CDC接收命令时通过SPI驱动外围设备

我们实现了SPI适配器,并管理了SDK AD_WRITE_FUNction。

我们有不同的问题:

- 当我们发送多个SPI写命令时,有些是不完整的。我们有一个用例,我们需要发送256次152字节数据消息(例如,例如0xFF),一些数据消息如下所示随机完成:

1111111111 ... <<完成
1111001111 ... <<不完整
0001111111 ... <<不完整
1111111111 ... <<完成
... 1111111111 ... <<完成
1111110000 ... <<不完整

- 我们使用示波器监控SPI总线,我们已经检查了芯片选择的延迟可以很长(高达100毫秒)。在附加的范围屏幕截图上可以看到这种延迟。

- 连接USB(USB CDC接口)时,SPI延迟增加(最多可达500ms)。我知道在连接USB时,3附加的任务正在运行,我们可以调整一些东西来改善这些时间吗?

我们尝试在下面的文档后面使用专用任务和队列实现SDK SPI异步事务,但提高不显着:

https://www.dialog-seminile.com/sites/default/files/da1468x_spi_adapter_tutorial_v2_1.pdf.

我们尝试调整在AD_SPI.H中定义的SPI参数,但没有显着的结果。

我们认为使用SDK参数调整可以提高此延迟。

此致

Matthieu.

依恋:
设备:
PM_DIALOG.
离线
最后一次露面:18小时20分钟前
职员
加入:2018-02-08 11:03
嗨matthieu,

嗨matthieu,

我会在内部检查您的问题并让您知道。

谢谢,PM_DIALOG.

PM_DIALOG.
离线
最后一次露面:18小时20分钟前
职员
加入:2018-02-08 11:03
嗨matthieuw,

嗨matthieuw,

我在内部询问团队,我们的硬件支持SPI奴隶,但我们的SDK并未完全实现。在附加的教程中,DA1468x配置为SPI主站。

谢谢,PM_DIALOG.

matthieuw.
离线
最后一次露面:7个月3周前
加入:2015-11-20 14:55
亲爱的对话框,

亲爱的对话框,

在我的项目中实现的SPI接口充当主机(DA14681控制外部外围设备)。因此,问题在于其他地方。

问候

Matthieu.

PM_DIALOG.
离线
最后一次露面:18小时20分钟前
职员
加入:2018-02-08 11:03
嗨matthieuw,

嗨matthieuw,

是否有可能使用逻辑分析仪,探测信号并提供SPI跟踪?这将是非常有帮助的..

此外,您是否可以分享一些关于如何使用SPI适配器的代码片段?不是所有项目,只有一些代码片段。

谢谢,PM_DIALOG.

CPELA.
离线
最后一次露面:2个月前1年
加入:2019-12-18 12:37
亲爱的对话框,

亲爱的对话框,

我是CPELA,我正在使用Matthieuw项目,

我已经调查了SPI,有些不对劲......

关于数据的问题不完整,它似乎只是一些消息的结尾是:

1111111111 ... <<完成
1111110000 ... <<不完整
1111111100 ... <<不完整
1111111111 ... <<完成
1111111111 ... <<完成
1111110000 ... <<不完整

随着SPI命令没有任务,我们创建了一个专用的任务SPI_TASK来发送我们的命令

我们的SPI命令将放入队列中,并从SPI任务中的队列中弹出。

最后,我们从其他功能中使用SPI通信,我们观察不完整的数据......

以下是SPI.c文件中的主要函数

SPI init:

// tesc comm uint8_t graysim [155];Bool Flaggraysim = 0;void spi_init(void){#if dg_configspi_adapter os_mutiex_create(spi1_mutex);ad_spi_init();spi_bus_init(spi1);spi_device_init(ulli);mdp05_dev = ad_spi_open(ulli);#万一 }

SPI任务:

void spi_task(){#if dg_configuse_wdog int8_t wdog_id = sys_watchdog_register(false); / *注册任务由看门狗监视* / #endif uint32_t notif;// init SPI总线和SPI通讯SPI_INIT();//队列创建if(tx_spi_queue == null){tx_spi_queue = user_queue_new(tx_spi_queue_size);} graysim [0] = cmd_write;graysim [2] = 0;Memset(&graysim [3],0xFF,152);for(;;){#if dg_configuse_wdog / *通知每个循环上的看门狗* / sys_watchdog_notify(wdog_id);/ *等待命令时暂停看门狗* / sys_watchdog_suspend(wdog_id);#endif os_task_notify_wait(0,os_task_notify_all_bits,&notf,os_task_notify_forever);if(user_queue_item_count(tx_spi_queue))//仅在队列不为空时分析数据{spiprocessing(); } #if dg_configUSE_WDOG /* resume watchdog */ sys_watchdog_notify_and_resume(wdog_id); #endif } } #endif

SPI处理功能:

__retained_code静态void慢性术(void){msg txspitosend;BOOL RET = 0;// pop itemps ret = user_queue_pop_items(tx_spi_queue,&txspitosend);if(ret){if(flaggraysim == 0){ad_spi_write(mdp05_dev,cmd_clear,1);//内存重置为0 flaggraysim = 1;} else {uint16_t i = 100;for(i = 0; i <255; i ++){graysim [1] = i;//行地址递增ad_spi_write(mdp05_dev,graysim,155);//内存重置为1} flaggraysim = 0;POP MSG_RELEASE之后(&txspitosend)后发布消息; // Call again task if queue is not empty if (user_queue_item_count(tx_spi_queue)) { OS_TASK_NOTIFY(spi_task_handle, 1, OS_NOTIFY_SET_BITS); } }

我们正在努力获得我们问题的一些范围捕获,

感谢您的回答,

CPELA.

PM_DIALOG.
离线
最后一次露面:18小时20分钟前
职员
加入:2018-02-08 11:03
嗨cpela和matthieuw,

嗨cpela和matthieuw,

谢谢你的意见。我将通过提供的代码片段并让您知道。可能,我需要在内部将其升级到团队中。

谢谢,PM_DIALOG.

CPELA.
离线
最后一次露面:2个月前1年
加入:2019-12-18 12:37
亲爱的对话框,

亲爱的对话框,

我们的问题似乎是关于我们不完整的数据的解决,但我在调查时注意到另一个问题......

在封闭的图片中,您可以看到问题的范围捕获,

我不知道为什么延迟太长,

当芯片选择转到0时,它需要30μs和80μs,直到SPI时钟被激活...帧结束时出现相同的问题,它需要30μs和80μs,直到芯片选择进入1.在2帧之间,我们在100μs和130μs延迟之间。

在我们的SPI任务中,我们称之为SDK的AD_SPI_WRITE,如果我们的CUL减少延误,则会很好,但我没有从延迟可能来的地方有任何想法......

谢谢你的帮助,

问候

依恋:
PM_DIALOG.
离线
最后一次露面:18小时20分钟前
职员
加入:2018-02-08 11:03
嗨cpela和matthieuw,

嗨cpela和matthieuw,

我为延迟道歉。我试图复制你的问题,但我未能重现它,因为它是自定义代码。这个最新的SPI捕获真的有助于我了解更好的问题。根据您提供的代码段,您正在使用同步SPI写(ad_spi_write())。当CS从1到0开始时,这意味着任何其他主设备都无法乘坐SPI总线,直到CS再次进入1.但是,当将CS置于0时,事务将无法立即启动,这是您的延迟看。请检查ad_spi_write()源代码。通过执行ad_spi_bus_activate_cs()将CS设置为0,但事务尚未启动。触发然后触发HW_SPI_WRITE_BUF()以启动SPI事务。通过调用HW_SPI_TRANSFER_WRITE(ID),开始写入在此函数调用的末尾; The delay you get is absolutely expected because between the time that the CS is set to 0 and the call of hw_spi_transfer_write(id), there is code execution!

谢谢,PM_DIALOG.