MCP2515 & STM32L053: проблема с SPI - PullRequest
0 голосов
/ 19 октября 2018

Я пытаюсь заставить 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 или мой фактический выход:

enter image description here

...