我们已经实现了对话框DA14681在一个自定义板作为一个从设备操作。
我们的系统主要目的是在通过BLE SPS或USB CDC接收命令时通过SPI驱动外围设备
我们使用SDK ad_write_function实现了spi适配器和man。
我们有不同的问题:
-当我们发送多个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.
设备:
嗨matthieu,
我会在内部检查您的问题并让您知道。
谢谢,PM_DIALOG.
嗨matthieuW,
我在内部询问团队,我们的硬件支持SPI奴隶,但我们的SDK并未完全实现。在附加的教程中,DA1468x配置为SPI主站。
谢谢,PM_DIALOG.
亲爱的对话框,
在我的项目中实现的spi接口是作为一个主(DA14681控制一个外部外设)。因此,问题出在别处。
问候
Matthieu.
嗨matthieuW,
有可能使用逻辑分析仪探测信号并提供SPI跟踪吗?这将非常有帮助。
此外,您是否可以分享一些关于如何使用SPI适配器的代码片段?不是所有项目,只有一些代码片段。
谢谢,PM_DIALOG.
亲爱的对话框,
我是cpela,我和matthiew一起做这个项目,
我调查了SPI,发现有问题…
关于数据的问题不完整,它似乎只是一些消息的结尾是:
1111111111……< <完成
1111110000 ... <<不完整
1111111100 ... <<不完整
1111111111……< <完成
1111111111……< <完成
1111110000 ... <<不完整
由于SPI命令不在任务中,我们创建了一个专用任务spi_task来发送我们的命令
我们的SPI命令将放入队列中,并从SPI任务中的队列中弹出。
最后,我们装饰了来自其他功能的SPI通信,我们观察不完整的数据…
以下是SPI.c文件中的主要函数
SPI init:
Spi的任务:
SPI处理功能:
我们正努力在一定程度上捕捉我们的问题,
感谢您的回答,
CPELA.
嗨cpela和matthieuw,
谢谢你的意见。我将通过提供的代码片段并让您知道。可能,我需要在内部将其升级到团队中。
谢谢,PM_DIALOG.
亲爱的对话框,
我们的问题似乎是关于我们不完整的数据的解决,但我在调查时注意到另一个问题......
在封闭的图片中,您可以看到问题的范围捕获,
我不知道为什么延迟太长,
当chip select = 0时,需要30 ~ 80µs的时间,直到spi时钟被激活。同样的问题在帧的末尾,它需要30µs到80µs的时间,直到chip select取1。在两帧之间,我们有100µs到130µs的延迟。
在我们的SPI任务中,我们调用SDK的ad_spi_write,这将是伟大的,如果我们可以减少延迟,但我不知道从哪里来的延迟…
谢谢你的帮助,
问候
嗨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);,在this函数调用的末尾开始写操作。 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.