打印
[STM8]

stm8l151C6 RC522 物理SPI没有SCK时钟

[复制链接]
1818|23
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zyf部长|  楼主 | 2021-9-8 23:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
调试好几天了,在网上试了好多方法还是不通,希望有大神给看下到底代码写的对不对,大家往下看:
硬件连接:
      使用的单片机为stm8l151C6,物理SPI和一个RC522芯片进行连接
      PB4:NSS片选
      PB5:SCK
      PB6:MOSI
      PB7:MISO
      PC4:RST(复位)
      PD6:pwr(电源,自己为低功耗设计)
问题:
      物理SPI初始化使能之后一直写数据,用示波器检测SCK引脚时钟,发现没有时钟信号
      程序一直卡在while (SPI_GetFlagStatus(SPI1, SPI_FLAG_RXNE) == RESET)
      模拟SPI通信没有问题

使用特权

评论回复
沙发
dingy| | 2021-9-8 23:41 | 只看该作者
楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因

使用特权

评论回复
板凳
zyf部长|  楼主 | 2021-9-8 23:44 | 只看该作者
void main(void)
{
    hardware_init();
    //enableInterrupts();   
    while (1)
    {
//        ReadRawRC(0x05);
        SPIWritebyte(0xAA);
//        BSP_RFID_WriteRegister(CommandReg,0xAA);
//      gpio_set_low(PORTB, PIN5);
//      gpio_set_high(PORTB, PIN5);
    }
}

void hardware_init(void)
{
    u8 rv = 0;
    u8 ctrl_reg = 0, ver_reg = 0;
   
//    gpio_set_high(PORTD, PIN7);
    // system clock init
    sysclk_init_hsi(CLK_SYSCLKDiv_1);
    //CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
    /* Select HSE as system clock source */
//  CLK_SYSCLKSourceSwitchCmd(ENABLE);
//  CLK_SYSCLKSourceConfig(CLK_SYSCLKSource_HSE);
  /*High speed external clock prescaler: 1*/
//  CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1);
   
    // com load configuration & init
    com_load_config(com_cfg, 1);
    com_init(COM1, 2400, USART_WordLength_9b, USART_StopBits_1, USART_Parity_Even, USART_Mode_All, ENABLE, 0);
    com_recv_init(COM1);
   
    /* Check if the system has resumed from IWDG reset */
    if (RST_GetFlagStatus(RST_FLAG_IWDGF) != RESET)
    {
        /* Clear IWDGF Flag */
        RST_ClearFlag(RST_FLAG_IWDGF);
        printf("RST_FLAG_IWDGF\r\n");
    }
   
    // rtc init
    rtc_init();
     
    BSP1_RFID_LoadConfig(&rfid_config); //加载管脚配置
    CLK_PeripheralClockConfig(CLK_Peripheral_SPI1, ENABLE);
    GPIO_Init(GPIOB, GPIO_Pin_4, GPIO_Mode_Out_PP_High_Fast); //NSS片选
    GPIO_Init(GPIOB, GPIO_Pin_5, GPIO_Mode_Out_PP_High_Fast); //SCK
    GPIO_Init(GPIOB, GPIO_Pin_6, GPIO_Mode_Out_PP_High_Fast); //MOSI
    //主机模式,配置为输入  
    GPIO_Init(GPIOB, GPIO_Pin_7, GPIO_Mode_In_PU_No_IT); //MISO
   
    BSP1_RFID_PowerOn();        //给RC522芯片上电
    //BSP1_RFID_PowerOff();
   
    SPI_DeInit(SPI1);
    SPI_Init(SPI1, SPI_FirstBit_MSB, SPI_BaudRatePrescaler_8, SPI_Mode_Master,SPI_CPOL_Low, SPI_CPHA_1Edge,SPI_Direction_2Lines_FullDuplex, SPI_NSS_Soft, 0x07);
    //SPI_Init(SPI1, SPI_FirstBit_MSB, SPI_BaudRatePrescaler_128, SPI_Mode_Master,SPI_CPOL_High, SPI_CPHA_2Edge,SPI_Direction_2Lines_FullDuplex, SPI_NSS_Soft, 0x07);
    SPI_Cmd(SPI1, ENABLE);  /* 使能SPI */
   
    rv = BSP1_RFID_Reset(&ctrl_reg, &ver_reg);  //和PcdReset库函数一模一样
    printf("ctrl_reg:%02X, ver_reg:%02X\r\n", ctrl_reg, ver_reg);
    if (rv != 0)
    {
        printf("rfid init error\r\n");
    }
    BSP_RFID_AntennaOff();
    delay_ms(1);
    BSP_RFID_AntennaOn();
    BSP_RFID_ConfigISOType('A');        //针对ISO14443A型卡进行初始化

    return;
}

/*! \brief
*       rc522 reset
* \return
*       MI_OK       - success
*       MI_ERR      - failure
*/
char BSP1_RFID_Reset(u8 *ctrl_reg, u8 *version)
{
    unsigned char val = 0;

    /* set rc522 rst to push pull output state , and set it to 0 */
    BSP_GPIO_Init(rfid_config_handler->rst.port, rfid_config_handler->rst.pin, GPIO_Mode_Out_PP_Low_Fast);
//    /* set rs522 nss to push pull output state, and set it to 1, disable sck,mosi,miso pin */
//    BSP_GPIO_Init(rfid_config_handler->nss.port, rfid_config_handler->nss.pin, GPIO_Mode_Out_PP_High_Fast);
//    /* set rc522 sck to push pull output state, and set it to 1 */
//    BSP_GPIO_Init(rfid_config_handler->sck.port, rfid_config_handler->sck.pin, GPIO_Mode_Out_PP_High_Fast);
//    /* set rc522 miso to push up input state*/
//    BSP_GPIO_Init(rfid_config_handler->miso.port, rfid_config_handler->miso.pin, GPIO_Mode_In_PU_No_IT);
//    //BSP_GPIO_Init(rfid_config_handler->miso.port, rfid_config_handler->miso.pin, GPIO_Mode_Out_PP_High_Fast);
//    /* set rc522 mosi to push pull output state, and set it to 1 */
//    BSP_GPIO_Init(rfid_config_handler->mosi.port, rfid_config_handler->mosi.pin, GPIO_Mode_Out_PP_High_Fast);

    delay_us(10);

    /* rs522 will be reset by setting rst to execute 1-0-1 sequence. */
    BSP_GPIO_SetHigh(rfid_config_handler->rst.port, rfid_config_handler->rst.pin);
    delay_us(10);
    BSP_GPIO_SetLow(rfid_config_handler->rst.port, rfid_config_handler->rst.pin);
    delay_us(10);
    BSP_GPIO_SetHigh(rfid_config_handler->rst.port, rfid_config_handler->rst.pin);
    delay_us(10);

    //    RC522_RST_H();
    //    delay_us(10);
    //    RC522_RST_L();
    //    delay_us(10);
    //    RC522_RST_H();
    //    delay_us(10);

    WriteRawRC(CommandReg,PCD_RESETPHASE);
    delay_us(10);

    WriteRawRC(ModeReg,0x3D);            //和Mifare卡通讯,CRC初始值0x6363
    WriteRawRC(TReloadRegL,30);
    WriteRawRC(TReloadRegH,0);
    WriteRawRC(TModeReg,0x8D);
    WriteRawRC(TPrescalerReg,0x3E);

    WriteRawRC(TxAutoReg,0x40);//必须要

    val = ReadRawRC(ControlReg);
    if (val == 0xFF)
    {
        //printf("CtlReg:%02X\r\n", val);
        return MI_ERR;
    }
   
    *ctrl_reg = val;

    val = ReadRawRC(VersionReg);
    if (val == 0xFF)
    {
        //printf("Ver:%02X\r\n", val);
        return MI_ERR;
    }
   
    *version = val;
//
//    BSP_RFID_AntennaOff();
//    BSP_RFID_ConfigISOType('A');
//    delay_ms(1);
//    BSP_RFID_AntennaOn();
   
    return MI_OK;
}

void SPIWritebyte(u8 Byte)
{
  u16 retry=0;
//  u8 rv = 0;
  
  while (SPI_GetFlagStatus(SPI1, SPI_FLAG_TXE) == RESET)
  {
    retry++;
    if(retry>200)
    {
      return;
    }
  }
  SPI_SendData(SPI1, Byte);
  retry=0;
  //while (SPI_GetFlagStatus(SPI1, SPI_FLAG_RXNE) == RESET)
  while (SPI_GetFlagStatus(SPI1, SPI_FLAG_BSY) == SET)
  {
    retry++;
    if(retry>400)return;
  }
  while (SPI_GetFlagStatus(SPI1, SPI_FLAG_RXNE) == RESET)
  {
    retry++;
    if(retry>400)return;
  }
  SPI_ReceiveData(SPI1);
}

使用特权

评论回复
地板
songqian17| | 2021-9-8 23:45 | 只看该作者
SCK时钟都没有;

使用特权

评论回复
5
huanghuac| | 2021-9-8 23:48 | 只看该作者
初始化配置不正确:引脚没配置对,也有可能SPI部分配置不正确吧

使用特权

评论回复
6
huanghuac| | 2021-9-8 23:50 | 只看该作者
看了你的代码,好像还差个管脚复用的REMAP的配置。

SYSCFG remap control register 1 (SYSCFG_RMPCR1)

使用特权

评论回复
7
zyf部长|  楼主 | 2021-9-8 23:52 | 只看该作者
你给看看哪里不正确?

使用特权

评论回复
8
zyf部长|  楼主 | 2021-9-8 23:54 | 只看该作者
不用寄存器用函数怎么写?我其他功能都没有初始化也要写复用吗?两个问题

使用特权

评论回复
9
songqian17| | 2021-9-8 23:59 | 只看该作者
我是指PB5作为spi CLK的复用功能,刚看了下手册,默认复用脚就是PB5,不需额外写代码了。
至于怎么写,函数库里也有相关代码。
void SYSCFG_REMAPPinConfig(REMAP_Pin_TypeDef REMAP_Pin, FunctionalState NewState);

使用特权

评论回复
10
songqian17| | 2021-9-9 22:08 | 只看该作者
只有涉及到管脚重映射需要重映射时才做相关操作;在数据手册里的管脚说明部分用【】提示了;

使用特权

评论回复
11
zwll| | 2021-9-9 22:13 | 只看该作者
STM8L固件库里有SPI操作的相关代码,你可以参考比较下配置;

使用特权

评论回复
12
zyf部长|  楼主 | 2021-9-9 22:15 | 只看该作者
加到了下面程序还是不行

使用特权

评论回复
13
zyf部长|  楼主 | 2021-9-9 22:17 | 只看该作者
BSP1_RFID_LoadConfig(&rfid_config); //加载管脚配置
    enableInterrupts();  
    CLK_PeripheralClockConfig(CLK_Peripheral_SPI1, ENABLE);
    GPIO_Init(GPIOB, GPIO_Pin_4, GPIO_Mode_Out_PP_High_Fast); //NSS片选
    GPIO_Init(GPIOB, GPIO_Pin_5, GPIO_Mode_Out_PP_Low_Fast); //SCK
    GPIO_Init(GPIOB, GPIO_Pin_6, GPIO_Mode_Out_PP_High_Fast); //MOSI
    //主机模式,配置为输入  
    GPIO_Init(GPIOB, GPIO_Pin_7, GPIO_Mode_In_PU_No_IT); //MISO
    SYSCFG_REMAPPinConfig(REMAP_Pin_SPI1Full, ENABLE);////////////////////加到了这里
   
//    SYSCFG remap control register 1 (SPI1_RMPCR1);
   
    BSP1_RFID_PowerOn();        //给RC522芯片上电
    //BSP1_RFID_PowerOff();
   
    SPI_DeInit(SPI1);
    SPI_Init(SPI1, SPI_FirstBit_MSB, SPI_BaudRatePrescaler_8, SPI_Mode_Master,SPI_CPOL_Low, SPI_CPHA_1Edge,SPI_Direction_2Lines_FullDuplex, SPI_NSS_Soft, 0x07);
    //SPI_Init(SPI1, SPI_FirstBit_MSB, SPI_BaudRatePrescaler_128, SPI_Mode_Master,SPI_CPOL_High, SPI_CPHA_2Edge,SPI_Direction_2Lines_FullDuplex, SPI_NSS_Soft, 0x07);
    SPI_Cmd(SPI1, ENABLE);  /* 使能SPI */
   
    rv = BSP1_RFID_Reset(&ctrl_reg, &ver_reg);  //和PcdReset库函数一模一样
    printf("ctrl_reg:%02X, ver_reg:%02X\r\n", ctrl_reg, ver_reg);
    if (rv != 0)
    {
        printf("rfid init error\r\n");
    }
    BSP_RFID_AntennaOff();
    delay_ms(1);
    BSP_RFID_AntennaOn();
    BSP_RFID_ConfigISOType('A');        //针对ISO14443A型卡进行初始化

使用特权

评论回复
14
gongche| | 2021-9-9 22:19 | 只看该作者
怎么没有时钟呢,主机提供

使用特权

评论回复
15
chuxh| | 2021-9-9 22:21 | 只看该作者
光这么看还珍说不好

使用特权

评论回复
16
llljh| | 2021-9-9 22:24 | 只看该作者
别的外设的初始化能通过吗

使用特权

评论回复
17
renyaq| | 2021-9-9 22:46 | 只看该作者
光是瞪着眼看  看不出来问题啊

使用特权

评论回复
18
huangchui| | 2021-9-9 22:48 | 只看该作者
io口进行配置了吗

使用特权

评论回复
19
zyf部长|  楼主 | 2021-9-9 22:50 | 只看该作者
搞定了,呵呵,犯了低级错误……多谢各位

使用特权

评论回复
20
kxsi| | 2021-10-5 17:16 | 只看该作者
可以自己模拟一下

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

694

主题

7102

帖子

8

粉丝