Я пытаюсь заставить CAN-контроллер MPC2515 работать с STML053R8 µC.Я использую этот драйвер / пример https://github.com/eziya/STM32_SPI_MCP2515 только с #include "stm32f1xx_hal.h"
, измененным на #include "stm32l0xx_hal.h"
.
Вот мой сокращенный код:
#define CAN_CS_Pin GPIO_PIN_5
#define CAN_CS_GPIO_Port GPIOA
extern SPI_HandleTypeDef hspi1;
#define SPI_CAN &hspi1
int CANSPI_Initialize(void)
{
// Some registers def
[...]
// This pass
if(MCP2515_Initialize() != 0)
return 1;
// This fails
if(MCP2515_SetConfigMode() != 0)
return 2;
[...]
}
int MCP2515_Initialize(void)
{
MCP2515_CS_HIGH();
uint8_t loop = 10;
do {
/* SPI Ready ? */
if(HAL_SPI_GetState(SPI_CAN) == HAL_SPI_STATE_READY)
return 0;
loop--;
} while(loop > 0);
return 1;
}
int MCP2515_SetConfigMode(void)
{
/* CANCTRL Register Configuration ?? ?? */
MCP2515_WriteByte(MCP2515_CANCTRL, 0x80);
uint8_t loop = 10;
do {
if((MCP2515_ReadByte(MCP2515_CANSTAT) & 0xE0) == 0x80)
return 0;
loop--;
} while(loop > 0);
return 1;
}
uint8_t MCP2515_ReadByte (uint8_t address)
{
uint8_t retVal;
MCP2515_CS_LOW();
SPI_Tx(MCP2515_READ);
SPI_Tx(address);
retVal = SPI_Rx();
MCP2515_CS_HIGH();
return retVal;
}
void MCP2515_WriteByte(uint8_t address, uint8_t data)
{
MCP2515_CS_LOW();
SPI_Tx(MCP2515_WRITE);
SPI_Tx(address);
SPI_Tx(data);
MCP2515_CS_HIGH();
}
Моя конфигурация SPI(генерируется STM32 CubeMX):
/* SPI1 init function */
static void MX_SPI1_Init(void)
{
/* SPI1 parameter configuration*/
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_2;
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi1.Init.CRCPolynomial = 7;
if (HAL_SPI_Init(&hspi1) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
}
и ссылка на таблицу данных MPC2515: http://ww1.microchip.com/downloads/en/DeviceDoc/20001801H.pdf
Моя проблема здесь в MCP2515_SetConfigMode()
, так как я установил регистр CANCTRL
, Я должен прочитать это значение («текущий режим является режимом конфигурации») в регистре CANSTAT
.
Также вчера я попытался сделать то же самое для модуля IMU LSM6DS3, и у меня возникла та же проблема, не удалосьдля чтения / записи регистров => невозможно связаться с устройством.Я подключил его к I2C (у этого IMU есть 2 интерфейса), и я заставляю его работать как чудо.
Код драйвера / примера, который я использую, мне кажется очень правильным, я проверил ВСЕ данные и регистры изи все выглядит нормально для меня.Я подозреваю, что мог что-то испортить в своей конфигурации SPI.
Любая помощь будет с благодарностью оценена!
РЕДАКТИРОВАТЬ: У меня нет логического анализатора, но я скачал для Arduino анализатор и получил этостранный вывод.Не уверен, что это ошибка Arduino или мой фактический выход: