我们在作为从设备运行的自定义板上实现了对话框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异步事务,但提高不显着:
//www.xmece.com/sites/default/files/da1468x_spi_adapter_tutorial_v2_1.pdf
我们尝试调整在AD_SPI.H中定义的SPI参数,但没有显着的结果。
我们认为这个延迟可以通过SDK参数调优来改善。
致以最亲切的问候
马修
设备:
嗨,马修,
我会在内部检查你的问题,然后告诉你。
谢谢,PM_Dialog
嗨matthieuw,
我在内部询问了团队,SPI Slave在我们的硬件中是支持的,但它并没有在我们的SDK中完全实现。在附加的教程中,DA1468x被配置为SPI master。
谢谢,PM_Dialog
亲爱的对话框,
在我的项目中实现的SPI接口充当主机(DA14681控制外部外围设备)。因此,问题在于其他地方。
问候
马修
嗨matthieuw,
是否有可能使用逻辑分析仪,探测信号并提供SPI跟踪?这将是非常有帮助的..
另外,您能分享一些关于如何使用SPI适配器的代码片段吗?不是所有的项目,只是一些代码片段。
谢谢,PM_Dialog
亲爱的对话框,
我是CPELA,我正在使用Matthieuw项目,
我已经调查了SPI,有些不对劲......
关于数据不完整的问题,它似乎只是一些消息的结尾:
1111111111 ... <<完成
1111110000……< <不完整
1111111100……< <不完整
1111111111 ... <<完成
1111111111 ... <<完成
1111110000……< <不完整
随着SPI命令没有任务,我们创建了一个专用的任务SPI_TASK来发送我们的命令
我们的spi命令被放入一个队列中,并从spi任务中的队列中弹出。
最后,我们从其他功能中使用SPI通信,我们观察不完整的数据......
下面是我们在spi.c文件中的主要函数
SPI初始化:
SPI任务:
Spi处理功能:
我们正在努力获得我们问题的一些范围捕获,
谢谢你的回答,
cpela
嗨,cpela和matthieuW,
谢谢你的建议。我将通过提供的代码片段,并让您知道。也许,我需要把它升级到团队内部。
谢谢,PM_Dialog
亲爱的对话框,
我们的问题似乎解决了,因为我们的数据不完整,但我在调查时注意到另一个问题……
在附图中,您可以看到问题的范围捕捉,
我不知道为什么延误这么久,
当芯片选择转到0时,它需要30μs和80μs,直到SPI时钟被激活...帧结束时出现相同的问题,它需要30μs和80μs,直到芯片选择进入1.在2帧之间,我们在100μs和130μs延迟之间。
在我们的SPI任务中,我们称之为SDK的AD_SPI_WRITE,如果我们的CUL减少延误,则会很好,但我没有从延迟可能来的地方有任何想法......
谢谢你的帮助,
问候
嗨,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