主题中讨论的其他器件:TCAN4550
您好!
我正在尝试将 TCAN4550 IC 与 STM 控制器连接、这已经成功完成、但当我在2-3个电路板上同时高速传输数据时、 然后、其中一个接收器停止接收(它仍在发送)、因此我检查了寄存器、发现这是 SPI 错误(写入下溢和读取溢出)造成的。
因此、请帮助我解决此 SPI 问题。
SPI 规格:
hspi2.instance = SPI2;
hspi2.Init.Mode = SPI_MODE_MASTER;
hspi2.Init.direction = SPI_DIRECT_2LINES;
hspi2.Init.DataSize = SPI_DATASIZE_8位;
hspi2.Init.CLKPolarity = SPI_POLICY_LOW;
hspi2.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi2.Init.nss = SPI_NSS_soft;
hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4;
hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi2.Init.TIMode = SPI_TIMDE_DISABLE;
hspi2.Init.CRCCalcirc= SPI_CRCCALCULATION_DISABLE;
hspi2.Init.CRCPolynomial = 7;
hspi2.Init.CRCLength = SPI_CRC_LENGTH_DATAIZE;
hspi2.Init.NSSPMode = SPI_NSS_PULSE_ENABLE;
SPI 通信 API:
void AHB_WRITE_32 (uint16_t 地址、uint32_t 数据)
{
AHB_WRITE_BURST_START (地址、1);
AHB_WRITE_BURST_WRITE (DATA);
AHB_WRITE_BURST_END ();
}
void AHB_WRITE_BURST_START (uint16_t 地址、uint8_t 字)
{
uint8_t txDataTemp[4];
txDataTemp[0]= AHB_WRITE_OCODE;
txDataTemp[1]=((address & 0xFF00)>>8);
txDataTemp[2]=(地址和0x00FF);
txDataTemp[3]=字;
HAL_GPIO_WritePin (TCAN_CS_GPIO_Port、TCAN_CS_Pin、GPIO_PIN_RESET);//芯片选择低电平
Wait_for_idle;
HAL_SPI_transmit (&hspi2、txDataTemp、4、50);
//wait_for_idle;
}
void AHB_WRITE_BURST_WRITE (uint32_t 数据)
{
uint8_t txDataTemp[4];
txDataTemp[0]((data & 0xFF000000)>24);
txDataTemp[1]=((data & 0x00FF0000)>16);
txDataTemp[2]=((data & 0x0000FF00)>>8);
txDataTemp[3]=(data & 0x000000FF);
//wait_for_idle;
HAL_SPI_transmit (&hspi2、txDataTemp、4、50);
//wait_for_idle;
}
void AHB_WRITE_BURST_END (void)
{
//wait_for_idle;
HAL_GPIO_WritePin (TCAN_CS_GPIO_Port、TCAN_CS_Pin、GPIO_PIN_SET);//芯片选择高电平
}
uint32_t AHb_read_32 (uint16_t 地址)
{
uint32_t returnData;
AHB_READ_BURST_START (地址、1);
返回数据= AHB_READ_BURST_READ ();
AHB_READ_BURST_END ();
返回返回数据;
}
void AHB_READ_BURST_START (uint16_t 地址、uint8_t 字)
{
uint8_t txDataTemp[4];
txDataTemp[0]= AHB_READ_OCODE;
txDataTemp[1]=((地址和0xFF00)>>8);
txDataTemp[2]=(地址& 0x00FF);
txDataTemp[3]=字;
HAL_GPIO_WritePin (TCAN_CS_GPIO_Port、TCAN_CS_Pin、GPIO_PIN_RESET);//芯片选择低电平
//TCAN_CS_GPIO_Port->BSRR =(uint32_t) TCAN_CS_Pin;
//wait_for_idle;
HAL_SPI_transmit (&hspi2、txDataTemp、4、50);
//wait_for_idle;
}
uint32_t AHB_READ_BURST_READ (空)
{
uint8_t rxDataTemp[4];
uint32_t returnData;
//wait_for_idle;
HAL_SPI_Receive (&hspi2、rxDataTemp、4、50);
//wait_for_idle;
返回数据=(((uint32_t) rxDataTemp[0])<< 24)|(((uint32_t) rxDataTemp[1]<< 16)|((((uint32_t) rxDataTemp[2])<< 8)| rxDataTemp[3];
返回返回数据;
}
void AHB_READ_BURST_END (void)
{
//wait_for_idle;
HAL_GPIO_WritePin (TCAN_CS_GPIO_Port、TCAN_CS_Pin、GPIO_PIN_SET);//芯片选择高电平
}
谢谢、此致
Yogesh
