主题中讨论的其他器件: CC1125、 CC1175
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 环路中重叠、但我不确定。 如何解决该问题?