主题中讨论的其他器件:TCAN4550、 TCAN4550-Q1、 CC1352R
您好!
我们尝试在 CC1352到 TCAN4550之间进行集成、但 所有读取/写入都失败了。
为了发送 SPI 事务、我们基于 TI spimaster 示例代码。
当我们尝试读取寄存器0x0000时、预期值为0x54、但它只读取0。
当主器件写入读取的 OP 代码(0x41)时、TCAN4550返回0x88、所有其余位为0。
请参阅信号分析器打印屏幕图片和 CC1352的 PuTTy 打印。
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、事务);
谢谢!
尊敬的 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配置的更多指导。
此致、
您好、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、您好!
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
来自 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