5回答

0收藏

基于GD32F190的非接触智能卡模块,之SPI接口函数设计

GD32 GD32 3740 人阅读 | 5 人回复 | 2016-06-07

void SPI_RC522_Init(void)
{
    GPIO_InitPara  GPIO_InitStructure;
    SPI_InitPara  SPI_InitStructure;

    RCC_AHBPeriphClock_Enable(RCC_AHBPERIPH_GPIOB, ENABLE);
    RCC_APB2PeriphClock_Enable(RCC_APB2PERIPH_SPI1, ENABLE);

    /* GPIO AF configuration */
    GPIO_PinAFConfig(GPIOB, GPIO_PINSOURCE13, GPIO_AF_0);
    GPIO_PinAFConfig(GPIOB, GPIO_PINSOURCE14, GPIO_AF_0);
    GPIO_PinAFConfig(GPIOB, GPIO_PINSOURCE15, GPIO_AF_0);

    /* SPI1_CLK(PB13),  SPII_MISO(PB14) and SPII_MOSI(PB15) GPIO pin configuration */
    GPIO_InitStructure.GPIO_Pin = GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15;
    GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ;
    GPIO_InitStructure.GPIO_Mode    = GPIO_MODE_AF;
    GPIO_InitStructure.GPIO_OType   = GPIO_OTYPE_PP;
    GPIO_InitStructure.GPIO_PuPd    = GPIO_PUPD_NOPULL;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    /* SPII_CS(PD2) GPIO pin configuration */
    GPIO_InitStructure.GPIO_Pin = GPIO_PIN_12;
    GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ;
    GPIO_InitStructure.GPIO_Mode    = GPIO_MODE_OUT;
    GPIO_InitStructure.GPIO_OType   = GPIO_OTYPE_PP;
    GPIO_InitStructure.GPIO_PuPd    = GPIO_PUPD_NOPULL;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    /* Chip select invalid*/
    GPIO_SetBits(GPIOB, GPIO_PIN_12);

    /* SPI1 configuration */
    SPI_InitStructure.SPI_TransType = SPI_TRANSTYPE_FULLDUPLEX;
    SPI_InitStructure.SPI_Mode = SPI_MODE_MASTER;
    SPI_InitStructure.SPI_FrameFormat = SPI_FRAMEFORMAT_8BIT;
    SPI_InitStructure.SPI_SCKPL = SPI_SCKPL_LOW;
    SPI_InitStructure.SPI_SCKPH = SPI_SCKPH_1EDGE;
    SPI_InitStructure.SPI_SWNSSEN = SPI_SWNSS_SOFT;
    SPI_InitStructure.SPI_PSC = SPI_PSC_8;
    SPI_InitStructure.SPI_FirstBit = SPI_FIRSTBIT_MSB;
    SPI_InitStructure.SPI_CRCPOL = 7;

    SPI_Init(SPI1, &SPI_InitStructure);
    SPI_Enable(SPI1, ENABLE);
}

后面对RC522操作就简单了,直接使用固件库中SPI读写函数:
写一字节:
int32_t SPI_WriteByte(SPI_TypeDef* SPIx, uint16_t TxData)
{
        uint8_t retry=0;                                 
        while (SPI_I2S_GetBitState(SPIx, SPI_FLAG_TBE) == RESET) //等待发送区空       
        {
                retry++;
                if(retry>200) return -1;
        }                          
        SPI_I2S_SendData(SPIx,TxData);                                                   //发送一个byte
}


读一字节:
注意该函数是接收缓存区返回的数据,对SPI接口没有操作。需要先检测是否收到数据
uint16_t SPI_ReadByte(SPI_TypeDef* SPIx)
{
        uint8_t retry=0;
        unit16_t result;
        while (SPI_I2S_GetBitState(SPIx, SPI_FLAG_RBNE) == RESET)                                //等待接收完一个byte  
        {
                retry++;
                if(retry>200)return -1;
        }
        result=SPI_I2S_ReceiveData( SPIx );                                                      
        return result;                                          //返回收到的数据
}




分享到:
回复

使用道具 举报

回答|共 5 个

倒序浏览

沙发

jwdxu2009

发表于 2016-6-7 22:45:15 | 只看该作者

写的好,参考和学习
板凳

suoma

发表于 2016-6-8 00:17:49 | 只看该作者

         RC522?
地板

lgxeefouse

发表于 2016-6-8 09:35:01 | 只看该作者

suoma 发表于 2016-6-8 00:17
RC522?

这个程序暂时是用RC522模块调的
5#

suoma

发表于 2016-6-8 20:11:55 | 只看该作者

lgxeefouse 发表于 2016-6-8 09:35
这个程序暂时是用RC522模块调的

可以将整个工程分享一下吗?我也在用RC522
6#

lgxeefouse

发表于 2016-6-9 13:06:15 | 只看该作者

suoma 发表于 2016-6-8 20:11
可以将整个工程分享一下吗?我也在用RC522

没有问题,本来就准备开源的
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条