我试图使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故障还是我的实际输出: