MCP2515和STM32L053:SPI问题

时间:2018-10-19 08:15:22

标签: c microcontroller stm32 spi hal

我试图使MPC2515 CAN控制器与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寄存器中的该值(“当前模式为配置模式”)。

昨天我也尝试对LSM6DS3 IMU模块做同样的事情,但遇到了同样的问题,无法 读/写寄存器=>无法与设备通信。我将其插入I2C(此IMU已插入 2个界面),我让它像魅力一样发挥作用。

我使用的驱动程序/示例代码对我来说非常有效,我检查了所有的数据和寄存器值 数据表,一切对我来说都很好。我怀疑我可能在SPI配置中搞砸了。

任何帮助将不胜感激!

编辑:我没有逻辑分析仪,但我为Arduino下载了分析仪,并得到了这个奇怪的输出。不确定这是Arduino故障还是我的实际输出:

enter image description here

0 个答案:

没有答案