你好,
我正在开发一个带有DA14531和NXP芯片的定制板,通过SPI连接。作为开发环境我使用Pro开发板,配DA14531子。
我为SPI拉了跳线,以便连接我的目标,驻留在它自己的板环境中。
NXP的芯片需要一个简单的协议。在读取时,上面的7位是寄存器地址,位0决定读或写。
因此,我猜,必须在读取时传输2个字节,第二个被忽略,但MISO是由NXP芯片驱动的。
我现在被困在图书馆里了。我在项目中关闭了DMA配置参数(删除了定义CFG_SPI_DMA_SUPPORT),并准备了'read_register'函数。
标准库在文件spi931.c的903行处循环停止:
//等待RX FIFO为空while (spi_rx_fifo_empty_status_getf() == SPI_RX_FIFO_IS_EMPTY);
这是我的图书馆电话:
unsigned char getRegister(unsigned int reg_address) {unsigned char reg_address = reg_address;for (int i = 0;我< sizeof (recv_buffer);++i) {recv_buffer[i] = (unsigned char) 0xaa;} reg_addressv = reg_addressv << 1;Reg_addressv |= 0x01;//标记读取trx_buffer[0] = reg_addressv;Trx_buffer [1] = 0;//虚拟spi_transfer(recv_buffer, trx_buffer, 1, SPI_OP_BLOCKING);返回recv_buffer [0]; }
我们感兴趣的行是调用spi_transfer()的行。
SoC初始化取自spi_flash项目,接口设置为字节传输。
事实上,我将spi_flash示例作为代码基并对其进行了修改。除了移除DMA支持外,所有初始化都保持原样。
我不处理中断。
哪里出了问题?
为什么rx fifo是空的?
它应该是非空的,即使没有附加到SPI端口引脚,我错了吗?
谢谢你的帮助和提示,
约阿希姆
关键词:
设备:
嗨joachimkr,
你能分享一下你是如何将外部MCU与DA14531 DK连接的吗?
那么,您运行它时是否附加了调试器,固件卡在这一行?
是否可以使用逻辑分析仪,探测SPI线并共享SPI捕获?
谢谢,PM_Dialog
你好,
谢谢你的反应。你的问题假设,这将是一个NXP CPU,这是附加的。不,它是外围设备。回答你的问题:
调试器停止,在给定的行中循环。我现在将附上一个分析仪,以确保我得到所有预期的反应:
与此同时,我解决了最基本的问题。结果表明,SPI控制器依赖于在调用事务函数之前将CS信号设置为活动的调用。在激活CS(在我的情况下是低)后,spi控制器工作了,我传递了一行,得到了一个字节的结果,正如预期的那样。当将MISO附加到low时,它为零,当为高时,0xFF,如预期的那样。
在代码和数据表中都没有描述这种依赖关系。
我建议在示例的源代码中添加注释。此外,我通过项目级别的定义禁用了DMA,并注意到通过闪存测试代码成功运行。缺少对库的一些描述。越基础,就越重要;-)
然而,它是干净和清晰的代码!
谢谢你的评论,
问候,约阿希姆
另一个问题出现了。字节宽的外围设备期望连续至少2个字节,第二个字节返回已寻址寄存器的正确内容。
为了解决这个问题,我添加了一个用于寄存器访问的实用程序,它在命令后发送一个虚拟字节(带有时钟脉冲),以获得返回值。
RxFifo中的第一个字节被忽略,垃圾。第二个字节作为函数result返回。
我很满意,但是在库代码中提出了一些额外的注释。我想,我不是唯一一个有类似问题的人。
总的来说:干得好!
约阿希姆
嗨joachimkr,
谢谢你!你的建议很好
Br,宜宾