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.

[参考译文] CC1120:STM32F446RE 定制 PCB 的 SPI 问题

Guru**** 2389240 points
Other Parts Discussed in Thread: CC1120, CC1125, BOOSTXL-CC1120-90, CC1175
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1353735/cc1120-spi-problem-with-stm32f446re-custom-pcb

器件型号:CC1120
主题中讨论的其他器件: CC1125CC1175

Im 目前正在使用定制 PCB、其中 CC1120作为收发器、stm32f446RET6作为 MCU。 我 从 CC1120库集成该库。 该器件使用 SPI 作为串行通信。 以下是用户手册中给出的通信示例:

借助这些信息、我将 SPI 设置配置为:

之后我使用 HAL_SPI_TransmitRecieve()函数作为我的通信 func。 导通时间。 但我不会分享这个复杂的库,而是我将演示的情况。  软件在空闲时、CS 引脚和 CC1120复位引脚为逻辑高电平。

txdata[0] = 0x30;

HAL_GPIO_WritePin(SPI1_CS_GPIO_Port, SPI1_CS_Pin, 0);

HAL_SPI_TransmitReceive(&hspi1, txdata, rxdata, 1, 500);

HAL_GPIO_WritePin(SPI1_CS_GPIO_Port, SPI1_CS_Pin, 1);

/* USER CODE END 2 */  

/* Infinite loop */

/* USER CODE BEGIN WHILE */

while (1)

{

txdata[0] = 0x2F;

HAL_GPIO_WritePin(SPI1_CS_GPIO_Port, SPI1_CS_Pin, 0);

HAL_SPI_TransmitReceive(&hspi1, txdata, rxdata, 1, 500);

HAL_GPIO_WritePin(SPI1_CS_GPIO_Port, SPI1_CS_Pin, 1);

HAL_Delay(20);

txdata[0] = 0x8F;

HAL_GPIO_WritePin(SPI1_CS_GPIO_Port, SPI1_CS_Pin, 0);

HAL_SPI_TransmitReceive(&hspi1, txdata, rxdata, 1, 500);

HAL_GPIO_WritePin(SPI1_CS_GPIO_Port, SPI1_CS_Pin, 1);

HAL_Delay(20);

txdata[0] = 0x00;

HAL_GPIO_WritePin(SPI1_CS_GPIO_Port, SPI1_CS_Pin, 0);

HAL_SPI_TransmitReceive(&hspi1, txdata, rxdata, 1, 500);

HAL_GPIO_WritePin(SPI1_CS_GPIO_Port, SPI1_CS_Pin, 1);

HAL_Delay(20);

/* USER CODE END WHILE */

  

/* USER CODE BEGIN 3 */

}

在此代码中 、我首先使用命令 SRES (0x30)复位器件。 在这种情况下、当我开始从 MOSI 线路进行传输时、器件必须从 MISO 线路发送芯片状态。 但在 MOSI 行中看不到芯片状态字节(Im 将0xFF 视为芯片状态字节)。  芯片状态字节在数据表中解释为:"当在 SPI 接口上发送标头字节、数据字节或命令选通时、CC112X 会在 SO 引脚上发送芯片状态字节。" 以及:

然后在 while 循环中,要访问零件号寄存器以读取芯片 ID。 芯片 ID 寄存器是一个扩展寄存器(0x2F8F)。 所以首先我发送0x2F、然后是0x8F、之后我想接收芯片 ID。 但我还是不能得到任何东西。
我无法到达 CC1120器件、但我不知道为什么。 我尝试了几种不同的配置。 我使用示波器来查看这些线路、SCK 线路在我看来很好。 这是 PCB 的 MCU 和射频部分。 与 CC1120的参考设计几乎相同:

那么、有一个外部32MHz 振荡器指示为 Y2、但我们没有该振荡器、因此我们使用32.578 MHz。 这对于器件来说是个问题吗?  以下是示波器结果:

通道1:SCK
通道2:MOSI
在 MISO 线路中、我只看到逻辑高电压、没有看到其他情况。 我认为 MOSI 线路范围会导致 while 环路中重叠、但我不确定。 如何解决该问题?