Como no pude hacer que CAN funcionara con la CAN interna de un STM32 (F103C8T6), compré algunos tableros CAN que funcionan con SPI, como estos :
Sinembargo,cuandoenvíoalgo,obtengolossiguientesresultadosutilizandounanalizadorlógico:
- Los canales 1, 2 y 3 son Reloj, MISO y MOSI del SPI receptor
- Los canales 4, 5 y 6 son Reloj, MISO y MOSI del SPI de transmisión
- Los canales 6 y 7 son CANH y CANL
Mi código relevante para el lado del remitente:
static void MX_SPI1_Init(void)
{
hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_MASTER;
hspi1.Init.Direction = SPI_DIRECTION_2LINES;
hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi1.Init.NSS = SPI_NSS_SOFT;
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_128;
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi1.Init.CRCPolynomial = 10;
if (HAL_SPI_Init(&hspi1) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
main:
while (1)
{
uint8_t data[] = { 1, 2, 3, 4, 5 };
if (HAL_SPI_Transmit(&hspi1, data, 5, 100) != HAL_OK)
{
Error_Handler();
}
HAL_Delay(1000);
}
(tenga en cuenta que no se llama al Error_Handler, por lo que el valor de retorno es HAL_OK.
Código del receptor:
static void MX_SPI1_Init(void)
{
hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_MASTER;
hspi1.Init.Direction = SPI_DIRECTION_2LINES;
hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi1.Init.NSS = SPI_NSS_SOFT;
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_128;
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi1.Init.CRCPolynomial = 10;
if (HAL_SPI_Init(&hspi1) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
}
main:
while (1)
{
HAL_SPI_Receive(&hspi1, data, 5, 100);
}
Preguntas:
-
¿Por qué no obtengo información del lado receptor? Parece que el SPI de envío está bien, el CANH de envío puede estar bien, pero CANL parece que no.
-
Hay dos puentes en la PCB CAN, pero no estoy seguro de lo que hacen (cuando coloco puentes, todavía no consigo nada en el lado SPI que recibe).
-
Puse tanto el Transmisor como el Receptor en el Maestro (porque luego ambos necesitan enviar mensajes). También probé con el transmisor al maestro y el receptor al esclavo, pero de nuevo no hay diferencia. ¿Cuál debería ser la configuración correcta?