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

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,这样是不是就能排除这个复用的冲突?
七哥 回答时间: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管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版