你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm8l151C6 RC522 物理SPI没有SCK时钟

[复制链接]
lmy11224433 提问时间:2018-3-2 15:37 /
调试好几天了,在网上试了好多方法还是不通,希望有大神给看下到底代码写的对不对,大家往下看:
硬件连接:
      使用的单片机为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通信没有问题
代码如下:
  1. void main(void)
  2. {
  3.     hardware_init();
  4.     //enableInterrupts();   
  5.     while (1)
  6.     {
  7. //        ReadRawRC(0x05);
  8.         SPIWritebyte(0xAA);
  9. //        BSP_RFID_WriteRegister(CommandReg,0xAA);
  10. //      gpio_set_low(PORTB, PIN5);
  11. //      gpio_set_high(PORTB, PIN5);
  12.     }
  13. }

  14. void hardware_init(void)
  15. {
  16.     u8 rv = 0;
  17.     u8 ctrl_reg = 0, ver_reg = 0;
  18.    
  19. //    gpio_set_high(PORTD, PIN7);
  20.     // system clock init
  21.     sysclk_init_hsi(CLK_SYSCLKDiv_1);
  22.     //CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
  23.     /* Select HSE as system clock source */
  24. //  CLK_SYSCLKSourceSwitchCmd(ENABLE);
  25. //  CLK_SYSCLKSourceConfig(CLK_SYSCLKSource_HSE);
  26.   /*High speed external clock prescaler: 1*/
  27. //  CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1);
  28.    
  29.     // com load configuration & init
  30.     com_load_config(com_cfg, 1);
  31.     com_init(COM1, 2400, USART_WordLength_9b, USART_StopBits_1, USART_Parity_Even, USART_Mode_All, ENABLE, 0);
  32.     com_recv_init(COM1);
  33.    
  34.     /* Check if the system has resumed from IWDG reset */
  35.     if (RST_GetFlagStatus(RST_FLAG_IWDGF) != RESET)
  36.     {
  37.         /* Clear IWDGF Flag */
  38.         RST_ClearFlag(RST_FLAG_IWDGF);
  39.         printf("RST_FLAG_IWDGF\r\n");
  40.     }
  41.    
  42.     // rtc init
  43.     rtc_init();
  44.      
  45.     BSP1_RFID_LoadConfig(&rfid_config); //加载管脚配置
  46.     CLK_PeripheralClockConfig(CLK_Peripheral_SPI1, ENABLE);
  47.     GPIO_Init(GPIOB, GPIO_Pin_4, GPIO_Mode_Out_PP_High_Fast); //NSS片选
  48.     GPIO_Init(GPIOB, GPIO_Pin_5, GPIO_Mode_Out_PP_High_Fast); //SCK
  49.     GPIO_Init(GPIOB, GPIO_Pin_6, GPIO_Mode_Out_PP_High_Fast); //MOSI
  50.     //主机模式,配置为输入  
  51.     GPIO_Init(GPIOB, GPIO_Pin_7, GPIO_Mode_In_PU_No_IT); //MISO
  52.    
  53.     BSP1_RFID_PowerOn();        //给RC522芯片上电
  54.     //BSP1_RFID_PowerOff();
  55.    
  56.     SPI_DeInit(SPI1);
  57.     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);
  58.     //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);
  59.     SPI_Cmd(SPI1, ENABLE);  /* 使能SPI */
  60.    
  61.     rv = BSP1_RFID_Reset(&ctrl_reg, &ver_reg);  //和PcdReset库函数一模一样
  62.     printf("ctrl_reg:%02X, ver_reg:%02X\r\n", ctrl_reg, ver_reg);
  63.     if (rv != 0)
  64.     {
  65.         printf("rfid init error\r\n");
  66.     }
  67.     BSP_RFID_AntennaOff();
  68.     delay_ms(1);
  69.     BSP_RFID_AntennaOn();
  70.     BSP_RFID_ConfigISOType('A');        //针对ISO14443A型卡进行初始化

  71.     return;
  72. }

  73. /*! \brief
  74. *       rc522 reset
  75. * \return
  76. *       MI_OK       - success
  77. *       MI_ERR      - failure
  78. */
  79. char BSP1_RFID_Reset(u8 *ctrl_reg, u8 *version)
  80. {
  81.     unsigned char val = 0;

  82.     /* set rc522 rst to push pull output state , and set it to 0 */
  83.     BSP_GPIO_Init(rfid_config_handler->rst.port, rfid_config_handler->rst.pin, GPIO_Mode_Out_PP_Low_Fast);
  84. //    /* set rs522 nss to push pull output state, and set it to 1, disable sck,mosi,miso pin */
  85. //    BSP_GPIO_Init(rfid_config_handler->nss.port, rfid_config_handler->nss.pin, GPIO_Mode_Out_PP_High_Fast);
  86. //    /* set rc522 sck to push pull output state, and set it to 1 */
  87. //    BSP_GPIO_Init(rfid_config_handler->sck.port, rfid_config_handler->sck.pin, GPIO_Mode_Out_PP_High_Fast);
  88. //    /* set rc522 miso to push up input state*/
  89. //    BSP_GPIO_Init(rfid_config_handler->miso.port, rfid_config_handler->miso.pin, GPIO_Mode_In_PU_No_IT);
  90. //    //BSP_GPIO_Init(rfid_config_handler->miso.port, rfid_config_handler->miso.pin, GPIO_Mode_Out_PP_High_Fast);
  91. //    /* set rc522 mosi to push pull output state, and set it to 1 */
  92. //    BSP_GPIO_Init(rfid_config_handler->mosi.port, rfid_config_handler->mosi.pin, GPIO_Mode_Out_PP_High_Fast);

  93.     delay_us(10);

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

  101.     //    RC522_RST_H();
  102.     //    delay_us(10);
  103.     //    RC522_RST_L();
  104.     //    delay_us(10);
  105.     //    RC522_RST_H();
  106.     //    delay_us(10);

  107.     WriteRawRC(CommandReg,PCD_RESETPHASE);
  108.     delay_us(10);

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

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

  115.     val = ReadRawRC(ControlReg);
  116.     if (val == 0xFF)
  117.     {
  118.         //printf("CtlReg:%02X\r\n", val);
  119.         return MI_ERR;
  120.     }
  121.    
  122.     *ctrl_reg = val;

  123.     val = ReadRawRC(VersionReg);
  124.     if (val == 0xFF)
  125.     {
  126.         //printf("Ver:%02X\r\n", val);
  127.         return MI_ERR;
  128.     }
  129.    
  130.     *version = val;
  131. //
  132. //    BSP_RFID_AntennaOff();
  133. //    BSP_RFID_ConfigISOType('A');
  134. //    delay_ms(1);
  135. //    BSP_RFID_AntennaOn();
  136.    
  137.     return MI_OK;
  138. }

  139. void SPIWritebyte(u8 Byte)
  140. {
  141.   u16 retry=0;
  142. //  u8 rv = 0;
  143.   
  144.   while (SPI_GetFlagStatus(SPI1, SPI_FLAG_TXE) == RESET)
  145.   {
  146.     retry++;
  147.     if(retry>200)
  148.     {
  149.       return;
  150.     }
  151.   }
  152.   SPI_SendData(SPI1, Byte);
  153.   retry=0;
  154.   //while (SPI_GetFlagStatus(SPI1, SPI_FLAG_RXNE) == RESET)
  155.   while (SPI_GetFlagStatus(SPI1, SPI_FLAG_BSY) == SET)
  156.   {
  157.     retry++;
  158.     if(retry>400)return;
  159.   }
  160.   while (SPI_GetFlagStatus(SPI1, SPI_FLAG_RXNE) == RESET)
  161.   {
  162.     retry++;
  163.     if(retry>400)return;
  164.   }
  165.   SPI_ReceiveData(SPI1);
  166. }
复制代码


收藏 评论4 发布时间:2018-3-2 15:37

举报

4个回答
wudianjun2001 回答时间:2018-3-2 16:41:40
GPIO初始化的时候,注意是不是有复用功能,
把外设去掉,单独用了测试函数测试一下看是否有信号

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

lmy11224433 回答时间:2018-3-2 18:02:11
wudianjun2001 发表于 2018-3-2 16:41
GPIO初始化的时候,注意是不是有复用功能,
把外设去掉,单独用了测试函数测试一下看是否有信号 ...

我其他功能全部都没有初始化,就用了SPI,这样是不是就能排除这个复用的冲突?
toofree 回答时间:2018-3-3 00:55:25
没看出SPI有什么问题来。用沙发楼wudianjun2001的建议,把其它都屏蔽掉,只保留SPI测试,看有没有时钟输出。

请参考固件库的样例程序“SPI_FLASH” 傲游截图20180303005236.jpg

这里面的单字节发送是这样写的:
  1. uint8_t sFLASH_SendByte(uint8_t byte)
  2. {
  3.   /* Loop while DR register in not emplty */
  4.   while (SPI_GetFlagStatus(sFLASH_SPI, SPI_FLAG_TXE) == RESET);

  5.   /* Send byte through the SPI peripheral */
  6.   SPI_SendData(sFLASH_SPI, byte);

  7.   /* Wait to receive a byte */
  8.   while (SPI_GetFlagStatus(sFLASH_SPI, SPI_FLAG_RXNE) == RESET);

  9.   /* Return the byte read from the SPI bus */
  10.   return SPI_ReceiveData(sFLASH_SPI);
  11. }
复制代码


没看来跟你的程序有本质的区别。

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

lmy11224433 回答时间:2018-3-5 08:58:15
toofree 发表于 2018-3-3 00:55
没看出SPI有什么问题来。用沙发楼wudianjun2001的建议,把其它都屏蔽掉,只保留SPI测试,看有没有时钟输出 ...

是的,我也看这个固件库里面flash的例子了,但是我的程序主函数里面什么都没有初始化,只做了SPI初始化,while里面一直在写数据,但是就是没有SCK时钟,也是很郁闷,如果用模拟SPI调试的话就没问题

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版