通过Hal库的mfrc522 spi连接

时间:2020-10-31 12:17:31

标签: stm32 spi

我正在尝试通过HAL_SPI_*() API与mfrc522进行连接,并至少读取VersionReg寄存器,但是我想读取的地址在数据中返回其地址,换句话说,它似乎具有回显!

这是我的SPI初始化:

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_32;
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();
}

这是我读取寄存器的功能:

 HAL_GPIO_WritePin(RD_SS_Port, RD_SS_Pin, GPIO_PIN_RESET);
 Address=0x37;
 ucAddr = ((Address<<1)&0x7E)|0x80;
// ucAddr=0xb7;
 d[0]=ucAddr;
while(HAL_SPI_GetState(&hspi1) != HAL_SPI_STATE_READY) { }
if (HAL_SPI_Transmit(&hspi1,d,2,20) != HAL_OK)
{
    printf("send error\r\n");
}

while(HAL_SPI_GetState(&hspi1) != HAL_SPI_STATE_READY) { }
if (HAL_SPI_Receive(&hspi1,r,1,20) != HAL_OK)
{
     printf("Receive error\r\n");
}

//  printf("i2=%x s[0]=%x r[0]=%x r[1]=%x \r\n",i,s[0],r[0],r[1]);
   ucResult=r[0];
return ucResult;

如果有人可以帮助我,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

实际上,第一次读取是可以的,并且在复位之后我可以读取一次VersionReg。 但是即使我将其放入循环中,也只有第一次读取就可以了(0x92),而其他读取了(0xee),这就是我发送给它的东西。