This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
您好!
我们尝试在 CC1352到 TCAN4550之间进行集成、但 所有读取/写入都失败了。
为了发送 SPI 事务、我们基于 TI spimaster 示例代码。
当我们尝试读取寄存器0x0000时、预期值为0x54、但它只读取0。
当主器件写入读取的 OP 代码(0x41)时、TCAN4550返回0x88、所有其余位为0。
请参阅信号分析器打印屏幕图片和 CC1352的 PuTTy 打印。
添加我们用于通过 SPI 从 TCAN4550读取寄存器0x0000的代码
/*初始化主 SPI 事务结构*/
masterTxBuffer[0]= 0x41;
masterTxBuffer[1]= 0x00;
masterTxBuffer[2]= 0x00;
masterTxBuffer[3]= 0x02;
memset ((void *) masterRxBuffer、0、SPI_MSG_LENGTH);
transaction.count = 12;
transaction.txBuf =(void *) masterTxBuffer;
transaction.rxBuf =(void *) masterRxBuffer;
/*切换用户 LED、指示正在进行 SPI 传输*/
GPIO_TOGGLE (CONFIG_GPIO_LED_1);
/*执行 SPI 传输*/
transferOK = SPI_transfer (masterSpi、事务);
谢谢!
Meron、
该启动代码是使用 MSP430系列处理器开发的。 是否修改了代码以启动 CC1352器件的 SPI 驱动程序? 此外、器件处于什么模式、您如何验证这一点?
此致、
尊敬的 Eric:
正如您在随附的图片中看到的、nWAKE 为低电平、INH 为高电平、因此从我的理解来看、这意味着它处于正常/待机模式、对吗?
关于启动代码、我们希望从简单的 SPI 读取开始。
在启动代码中、我们发现在 CC1352 SPImaster 项目中未找到以黄色标记的相同 SPI 设置。
请参阅以下一些差异、您认为没有这些行仍能正常工作吗?
SPIParam.selectClockSource=EUSCI_B_SPI_CLOCKSOURCE_SMCLK;
SPIParam.clockSourceFrequency=80000;
SPIParam.desiredSpiClock=2000000;
SPIParam.msbFirst=EUSCI_B_SPI_MSB_FIRST;
SPIParam.clockPhasy=EUSCI_B_SPI_PHASE_DATA_Captured_ONFIRST_Changed_ON_NEXT;
SPIParam.clockPolarity=EUSCI_B_SPI_CLOCKPOLARITY_INACT_LOW;
SPIParam.spiMode=EUSCI_B_SPI_4PIN_UCxSTE_ACTIVE_HIGH;
感谢你的帮助
Meron、
当 INH 为高电平时、这表示待机或正常模式、这两种模式都启用了 SPI、因此这不应成为问题。 您突出显示的部分是配置时钟频率、以及如何根据时钟边沿移入和移出数据。 如果不存在这种情况、则可能会根据 SPI 时钟时序错误配置 SPI。 这将解释 SPI 读回所有0的原因。 如果实际上没有任何数据被正确地传输到 TCAN4550-Q1、它将不会用任何东西进行响应。
是否可以共享 SPI 示波器波形?
此致、
Meron、
谢谢、虽然时钟波形末尾附近有一个时钟跳过周期的点、但看起来芯片选择和时钟时序是正确的。 有什么想法、为什么会发生这种情况?
此外、器件看起来会通过帧开头的0x88报告一些中断。 这反映了寄存器0x0820中位[7:0]的值、这些位的0x88表示全局错误和 SPI 错误。 全局错误只是表示任何中断或错误被置为有效、但在这种情况下、SPI 错误更有趣。 它报告任何内容这一事实意味着您的 SPI 配置正确、但某些情况会导致帧的其余部分不报告任何信息。
根据数据表的第42页、验证 SPI 时钟和芯片选择配置是否正确、从屏幕截图中可以看出这种情况、但我只想验证一下。 此外、请查看 TCAN4550-Q1文件夹中的软件用户指南、它将提供有关 SPI 和 TCAN4550-Q1配置的更多指导。
此致、
尊敬的 Eric:
您能帮助我们了解这个问题吗?
可能是时钟问题? 正如您之前所写的、时钟波形末尾附近有一个点、时钟跳过一个周期。
主机是 CC1352 (TI)、我们正在使用 SPI 主器件示例代码、您能在这里为我们提供帮助吗?
谢谢、
Meron
Meron、
我希望8位的片选突发在 TCAN4550-Q1中仍然可以正常工作、但可能存在一些设置和保持时间问题。 让我们看看在整个交易期间将芯片选择更改为恒定低是否会有所帮助。 支持 CC1352的团队工程师已收到有关此主题的通知。
此致、
Eric Hackett
Meron、您好!
您是否确认了 CC1352方面会发生什么情况? 您能否显示 SPI 发生器的完整图?
从我可以看到的内容来看、您似乎将 TX 缓冲区设置为4个字节、然后提到您要传输12个字节、但在示波器上有8个脉冲。 您能否解释一下您在 CC1352端尝试执行的操作、您使用的是哪一个示例以及如何对其进行配置?
谢谢、
ELIN
您好、Elin、
我们使用的代码基于 SPI 主器件示例、具有以下 SPI 设置:
/*将 SPI 作为主器件打开(默认)*/
SPI_Params_init (&spiParams);
spiParams.frameFormat = SPI_POL0_PHA0;
spiParams.bitrate = 4000000;
spiParams.dataSize = 8;
masterSpi = SPI_open (CONFIG_SPI_MASTER、&spiParams);
在下面、您可以看到来自 TCAN4550的读取操作:
masterTxBuffer[0]= 0x41;
masterTxBuffer[1]= 0x00;
masterTxBuffer[2]= 0x00;
masterTxBuffer[3]= 0x2;
memset ((void *) masterRxBuffer、0、SPI_MSG_LENGTH);
transaction.count = 12;
transaction.txBuf =(void *) masterTxBuffer;
transaction.rxBuf =(void *) masterRxBuffer;
/*切换用户 LED、指示正在进行 SPI 传输*/
GPIO_TOGGLE (CONFIG_GPIO_LED_1);
/*执行 SPI 传输*/
transferOK = SPI_transfer (masterSpi、事务);
在下面、您可以看到所有已发送 12个字节的 SCOP 全图。 黄色:MISO、红色:MOSI、蓝色:CS、绿色:CLK
随附了同一个交易连接的 Spy 模式逻辑分析仪的图片仅监听:
SPI 发生器实验室工具、生成 SPI 信号注意:CC1352已断开连接:
从工具写入下一个 SPI 事务 0x41 0x0 0x0 0x2、并读取 :4e、41、43、54、30、 35、35、34、
正如我们对 TCAN4550 DS 的预期
SCOP 图片黄色:MISO、红色:MOSI、蓝色:CS、绿色:CLK
下一张图片的完整范围为了查看所有事务、它看起来比 CC1532长得多、CS 和首次写入之间的空间更大。
放大到写入:
放大读数
谢谢!
我看到有一些照片上载/连接不好、我将再次尝试重新发送
从上次按摩开始:
"
随附了同一个交易连接的 Spy 模式逻辑分析仪的图片仅监听:
SPI 发生器实验室工具、 生成 SPI 信号注意:CC1352已断开连接:
从工具写入下一个 SPI 事务 0x41 0x0 0x0 0x2、并读取 :4e、41、43、54、30、 35、35、34、
正如我们对 TCAN4550 DS 的预期
"
谢谢
您好!
有更新吗?
谢谢
Meron、
感谢您的耐心等待、很抱歉耽误您的时间。 下周我们将为您提供一份回复。
此致、
Meron、您好!
Eric 要求我帮助我发布此帖子。 我有您使用的相同 SPI 实验室工具、我会定期将它们与 TCAN4550配合使用。 使用 SPI 实验工具时、CS 信号和看到的数据之间的长延迟是因为该工具使用与其余 SPI 模式数据不同的单独软件命令来控制 CS 线路。 这将导致向该工具发送单独的 USB 命令、一个用于将 CS 线路设置为低电平、一个用于 SPI 数据、另一个用于将 CS 线路再次设置为高电平。 我在 PC 上看到了大约7到10ms 的延迟、但这不是问题。
问题似乎出在每8位后 CC1352如何切换 CS 线路。 TCAN4550需要一个32位字用于每个 SPI 事务、它实际上对 CS 转换之间的时钟周期数进行计数。 如果没有32位的确切倍数(即32、64、96、128等)、则它假定发生了错误、数据无效。
如果它是"写入"命令、则会丢弃传入的数据、并设置 SPI 错误(SPIERR)标志以通知 MCU 该错误。 如果是"读取"、则器件将不会响应或完全响应、并且还会设置 SPIERR 标志、以通知 MCU 上一个事务可能包含错误。
虽然我不熟悉 CC1532 SPI 主设备代码、但似乎 MCU 将在每个"事务"的开头和结尾转换 CS 线路、并且每个事务使用8位。 如果您让它执行12次事务、因为您要传输12个字节的数据、那么它将按示波器图中所示将 CS 线路切换12次。
您需要做的是找到控制每个事务中 CS 线路的函数、您需要修改此函数以防止其切换。
然后、您需要从本质上模拟您的 SPI 实验工具、并创建一个新函数、该函数只需将 CS 线路切换为低电平(我将其称为"CS_Low ()")、并创建一个单独的函数来将 CS 线路切换为高电平、我将调用"CS_High ()"。 或者、您也可以执行 CS_Toggle (state)等单个函数并将其传递为1或0等
然后在代码中、您需要:
1) 调用 CS_Low()函数启动事务
2) 针对您要写入或读取的32位字调用所有与 SPI 数据相关的函数
3) 调用 CS_High()函数结束事务。
由于您已经与 SPI 实验室工具进行了可靠的通信、因此您可以将其用作参考、使您的 MCU 代码与波形相匹配。 只要 CS 之间有32位的精确倍数、您就应该会成功。
此致、
Jonathan
您好!
我们尽快需要您的帮助。
我们需要知道在何处更改代码以控制 CS。
谢谢、
Meron、您好!
我们已联系 CC1532团队的某个人、以帮助了解有关如何调整芯片选择的说明。 我们很快就会跟进。
此致、
Jonathan
我是否可以询问是否进行了进一步调查? 我们目前正在考虑使用 TCAN4550的 CC1352R。
Henrik、
我现在联系 EP 团队、看看他们是否可以发布如何调整 CC 器件的芯片选择功能、因为这似乎是造成此问题的根本原因。
此致、
Eric Hackett
尊敬的 Henrik:
对拖延表示歉意。 我们将在下周团队从复活节假期回来时为您寻找解释。
来自 TRM (Motorola SPI 格式(连续传输、SPO = 0和 SPH = 0)
“对于连续的背靠背传输,SSIn_FSS 信号必须在每次数据字传输之间产生高脉冲,因为从机选择引脚会冻结其串行外设寄存器中的数据,如果 SPH 位清零,则不允许更改数据。”
但是,您可以选择使用“三引脚”模式。 在这种情况下、控制 CSn 信号的是应用程序。
发送的每个字节之间仍会有延迟、但 CSn 不会在这些字节之间生效:
代码如下:
#define THREADSTACKSIZE (1024) #define SPI_MSG_LENGTH (12) SPI_Handle spiHandle; SPI_Transaction spiTransaction; unsigned char masterRxBuffer[SPI_MSG_LENGTH]; unsigned char masterTxBuffer[SPI_MSG_LENGTH] = {0x41, 0x00, 0x00, 0x2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; void *masterThread(void *arg0) { GPIO_init(); SPI_Params spiParams; SPI_init(); SPI_Params_init(&spiParams); spiParams.frameFormat = SPI_POL0_PHA0; spiParams.mode = SPI_MASTER; spiParams.transferMode = SPI_MODE_BLOCKING; spiParams.bitRate = 4000000; spiHandle = SPI_open(CONFIG_SPI_0, &spiParams); if (spiHandle == NULL) { while (1); } /* Start transfer */ spiTransaction.count = SPI_MSG_LENGTH; spiTransaction.txBuf = masterTxBuffer; spiTransaction.rxBuf = masterRxBuffer; while (1) { GPIO_write(CONFIG_GPIO_0, 0); // CSn = 0 SPI_transfer(spiHandle, &spiTransaction); GPIO_write(CONFIG_GPIO_0, 1); // CSn _ 1 } }
BR
Siri