Other Parts Discussed in Thread: TCAN4550
Hello,
I'm trying to interface TCAN4550 ic with STM controller, which I've done successfully, but when I communicate data a high speed simultaneously in 2-3 boards, then one of the receiver stops receiving (It is still transmitting) So I checked the registers and I found that this is due to SPI Errors (Write underflow and read overflow).
So please help me to resolve this SPI issue.
SPI Specs:
hspi2.Instance = SPI2;
hspi2.Init.Mode = SPI_MODE_MASTER;
hspi2.Init.Direction = SPI_DIRECTION_2LINES;
hspi2.Init.DataSize = SPI_DATASIZE_8BIT;
hspi2.Init.CLKPolarity = SPI_POLARITY_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_TIMODE_DISABLE;
hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi2.Init.CRCPolynomial = 7;
hspi2.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
hspi2.Init.NSSPMode = SPI_NSS_PULSE_ENABLE;
SPI Communication API's:
void AHB_WRITE_32(uint16_t address, uint32_t data)
{
AHB_WRITE_BURST_START(address, 1);
AHB_WRITE_BURST_WRITE(data);
AHB_WRITE_BURST_END();
}
void AHB_WRITE_BURST_START(uint16_t address, uint8_t words)
{
uint8_t txDataTemp[4];
txDataTemp[0]=AHB_WRITE_OPCODE;
txDataTemp[1]=((address & 0xFF00)>>8);
txDataTemp[2]=(address & 0x00FF);
txDataTemp[3]=words;
HAL_GPIO_WritePin(TCAN_CS_GPIO_Port, TCAN_CS_Pin, GPIO_PIN_RESET); //chip select low
WAIT_FOR_IDLE;
HAL_SPI_Transmit(&hspi2, txDataTemp, 4, 50);
//WAIT_FOR_IDLE;
}
void AHB_WRITE_BURST_WRITE(uint32_t data)
{
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); //chip select High
}
uint32_t AHB_READ_32(uint16_t address)
{
uint32_t returnData;
AHB_READ_BURST_START(address, 1);
returnData = AHB_READ_BURST_READ();
AHB_READ_BURST_END();
return returnData;
}
void AHB_READ_BURST_START(uint16_t address, uint8_t words)
{
uint8_t txDataTemp[4];
txDataTemp[0] = AHB_READ_OPCODE;
txDataTemp[1] = ((address & 0xFF00)>>8);
txDataTemp[2] = (address & 0x00FF);
txDataTemp[3] = words;
HAL_GPIO_WritePin(TCAN_CS_GPIO_Port, TCAN_CS_Pin, GPIO_PIN_RESET); //chip select low
//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(void)
{
uint8_t rxDataTemp[4];
uint32_t returnData;
//WAIT_FOR_IDLE;
HAL_SPI_Receive(&hspi2, rxDataTemp, 4, 50);
//WAIT_FOR_IDLE;
returnData = (((uint32_t)rxDataTemp[0]) << 24) | (((uint32_t)rxDataTemp[1] << 16)) | (((uint32_t)rxDataTemp[2]) << 8) | rxDataTemp[3];
return returnData;
}
void AHB_READ_BURST_END(void)
{
//WAIT_FOR_IDLE;
HAL_GPIO_WritePin(TCAN_CS_GPIO_Port, TCAN_CS_Pin, GPIO_PIN_SET); //chip select High
}
Thanks & Regards
Yogesh