初级会员

- 积分
- 67
- 金钱
- 67
- 注册时间
- 2020-3-30
- 在线时间
- 8 小时
|
在后面会附上这两种MFRCC522寻卡的例程,亲测有效
//第一种:这种方法比较简单,就是通过库函数stm32f10x_spi.h里面的函数进行调用,不过要这样的话必须对 SCK,MOSI,MISO 等管教进行复用推挽初始化
#include "spi1.h"
#include "sys.h"
/*
函数名:SPI1的初始化
描述:对CS片选、时钟信号、数据(输出)MOSI、数据线(输入)MISO的管脚进行声明
调用:外部调用
*/
void SPI1_Init(void)
{
SPI_InitTypeDef SPI_InitStrue;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE );//PORTA、B时钟使能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE);
// CS
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化PF0、PF1
// SCK
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure);
// MISO
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure);
// MOSI
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure);
// RST
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure);
SPI_InitStrue.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_256;
SPI_InitStrue.SPI_CPHA=SPI_CPHA_1Edge;
SPI_InitStrue.SPI_CPOL=SPI_CPOL_Low;
SPI_InitStrue.SPI_CRCPolynomial=0x7;
SPI_InitStrue.SPI_DataSize=SPI_DataSize_8b;
SPI_InitStrue.SPI_Direction=SPI_Direction_2Lines_FullDuplex;
SPI_InitStrue.SPI_FirstBit=SPI_FirstBit_MSB;
SPI_InitStrue.SPI_Mode=SPI_Mode_Master;
SPI_InitStrue.SPI_NSS=SPI_NSS_Soft;
SPI_Init(SPI1,&SPI_InitStrue);
SPI_Cmd(SPI1,ENABLE);
SPI2_ReadWriteByte(0xff);//启动传输
}
/*
* 函数名:SPI_RC522_SendByte
* 描述 :向RC522发送1 Byte 数据
* 输入 :byte,要发送的数据
* 返回 : RC522返回的数据
* 调用 :外部调用
*/
u8 SPI2_ReadWriteByte(u8 txd)
{
u8 t=0;
while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE)==RESET);
SPI_I2S_SendData(SPI1,txd);
t=0;
while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE)==RESET);
return SPI_I2S_ReceiveData(SPI1);
}
//第2种方法:对所有引脚(CS,SCK,MISO,MOSI,RST都是推挽输出),然后对MOSI,MISO在SCK时钟下进行模拟输出,输入(过程有点类似I2C的通讯过程)
void SPI1_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE );//PORTA、B时钟使能
// CS
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化PF0、PF1
// SCK
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure);
// MISO
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure);
// MOSI
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure);
// RST
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
/*
* 函数名:SPI_RC522_SendByte
* 描述 :向RC522发送1 Byte 数据
* 输入 :byte,要发送的数据
* 返回 : RC522返回的数据
* 调用 :内部调用
*/
void SPI_RC522_SendByte ( u8 byte )
{
u8 counter;
for(counter=0; counter<8; counter++)
{
if ( byte & 0x80 )
RC522_MOSI_1 ();
else
RC522_MOSI_0 ();
RC522_DELAY();
RC522_SCK_0 ();
RC522_DELAY();
RC522_SCK_1();
RC522_DELAY();
byte <<= 1;
}
}
/*
* 函数名:SPI_RC522_ReadByte
* 描述 :从RC522发送1 Byte 数据
* 输入 :无
* 返回 : RC522返回的数据
* 调用 :内部调用
*/
u8 SPI_RC522_ReadByte ( void )
{
u8 counter;
u8 SPI_Data;
for(counter=0; counter<8; counter++)
{
SPI_Data <<= 1;
RC522_SCK_0 ();
RC522_DELAY();
if ( RC522_MISO_GET() == 1)
SPI_Data |= 0x01;
RC522_DELAY();
RC522_SCK_1 ();
RC522_DELAY();
}
// printf("****%c****",SPI_Data);
return SPI_Data;
}
|
|