[STM32F3] 硬件SPI驱动W5500的问题

[复制链接]
725|0
 楼主| 比神乐 发表于 2023-5-19 17:13 | 显示全部楼层 |阅读模式
搞了好长时间,一直没搞好。
这个SPI接口的W5500模块有例程,STM32F103C8T6,可以正常通信。
我现在用STM32F303ZET6搞。
用的SPI1,PA4,PA5,PA6,PA7.PA4是CS,自己控制,
PA5是SCLK,PA6是MISO,PA7是MOSI。
这部分初始代码为:
  1. void SPI_Configuration(void)
  2. {
  3.         GPIO_InitTypeDef         GPIO_InitStructure;
  4.         SPI_InitTypeDef           SPI_InitStructure;          

  5.           RCC_APB2PeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_APB2Periph_SPI1 , ENABLE);       
  6.         GPIO_PinAFConfig(GPIOA, GPIO_PinSource5,GPIO_AF_5);
  7.         GPIO_PinAFConfig(GPIOA,GPIO_PinSource6,GPIO_AF_5);
  8.         GPIO_PinAFConfig(GPIOA,GPIO_PinSource7,GPIO_AF_5);
  9.         /* ³õʼ»¯SCK¡¢MISO¡¢MOSIÒý½Å */
  10.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
  11.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  12.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  13.         //GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
  14.         GPIO_Init(GPIOA, &GPIO_InitStructure);
  15.         GPIO_SetBits(GPIOA,GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);

  16.         /* ³õʼ»¯CSÒý½Å */
  17.         GPIO_InitStructure.GPIO_Pin = W5500_SCS;
  18.         GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  19.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  20.         GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
  21.         GPIO_Init(W5500_SCS_PORT, &GPIO_InitStructure);
  22.         GPIO_SetBits(W5500_SCS_PORT, W5500_SCS);

  23.         /* ³õʼ»¯ÅäÖÃSTM32 SPI1 */
  24.         SPI_InitStructure.SPI_Direction=SPI_Direction_2Lines_FullDuplex;        //SPIÉèÖÃΪ˫ÏßË«Ïòȫ˫¹¤
  25.         SPI_InitStructure.SPI_Mode=SPI_Mode_Master;                                                        //ÉèÖÃΪÖ÷SPI
  26.         SPI_InitStructure.SPI_DataSize=SPI_DataSize_8b;                                                //SPI·¢ËͽÓÊÕ8λ֡½á¹¹
  27.         SPI_InitStructure.SPI_CPOL=SPI_CPOL_Low;                                                        //ʱÖÓÐü¿ÕµÍ
  28.         SPI_InitStructure.SPI_CPHA=SPI_CPHA_1Edge;                                                        //Êý¾Ý²¶»ñÓÚµÚ1¸öʱÖÓÑØ
  29.         SPI_InitStructure.SPI_NSS=SPI_NSS_Soft;                                                                //NSSÓÉÍⲿ¹Ü½Å¹ÜÀí
  30.         SPI_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_2;        //²¨ÌØÂÊÔ¤·ÖƵֵΪ2
  31.         SPI_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB;                                        //Êý¾Ý´«Êä´ÓMSBλ¿ªÊ¼
  32.         SPI_InitStructure.SPI_CRCPolynomial=7;                                                                //CRC¶àÏîʽΪ7
  33.         SPI_Init(SPI1,&SPI_InitStructure);                                                                        //¸ù¾ÝSPI_InitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèSPI1¼Ä´æÆ÷

  34.         SPI_Cmd(SPI1,ENABLE);        //STM32ʹÄÜSPI1
  35. }
基本上照抄103的代码,做了一些修改。
我感觉这里可能有问题。
第二个可能有问题的地方是发送函数
  1. void SPI1_Send_Byte(unsigned char dat)
  2. {
  3.         SPI_I2S_SendData(SPI1,dat);//д1¸ö×Ö½ÚÊý¾Ý
  4.         while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);//µÈ´ýÊý¾Ý¼Ä´æÆ÷¿Õ
  5. }
第三个可能有问题的地方是接收函数
  1. uint8_t SPI_ReceiveData(SPI_TypeDef* SPIx)
  2. {
  3.   /* Check the parameters */
  4.   assert_param(IS_SPI_ALL_PERIPH(SPIx));
  5.   
  6.   /* Return the data in the DR register */
  7.   return SPIx->DR;
  8. }
还有一点,调试的时候,发现老是卡在这一个函数
  1. void W5500_Hardware_Reset(void)
  2. {
  3.         GPIO_ResetBits(W5500_RST_PORT, W5500_RST);//¸´Î»Òý½ÅÀ­µÍ
  4.         Delay(50);
  5.         GPIO_SetBits(W5500_RST_PORT, W5500_RST);//¸´Î»Òý½ÅÀ­¸ß
  6.         Delay(200);
  7.         while((Read_W5500_1Byte(PHYCFGR)&LINK)==0);//µÈ´ýÒÔÌ«ÍøÁ¬½ÓÍê³É
  8. }
就是while循环那一句。
后来我跟踪调试,发现
  1. unsigned char Read_W5500_1Byte(unsigned short reg)
  2. {
  3.          unsigned char i;

  4.         GPIO_ResetBits(W5500_SCS_PORT, W5500_SCS);//ÖÃW5500µÄSCSΪµÍµçƽ
  5.                        
  6.         SPI1_Send_Short(reg);//ͨ¹ýSPI1д16λ¼Ä´æÆ÷µØÖ·
  7.         SPI1_Send_Byte(FDM1|RWB_READ|COMMON_R);//ͨ¹ýSPI1д¿ØÖÆ×Ö½Ú,1¸ö×Ö½ÚÊý¾Ý³¤¶È,¶ÁÊý¾Ý,Ñ¡ÔñͨÓüĴæÆ÷

  8.         i=SPI_ReceiveData(SPI1);
  9.         SPI1_Send_Byte(0x00);//·¢ËÍÒ»¸öÑÆÊý¾Ý
  10.         i=SPI_ReceiveData(SPI1);//¶ÁÈ¡1¸ö×Ö½ÚÊý¾Ý

  11.         GPIO_SetBits(W5500_SCS_PORT, W5500_SCS);//ÖÃW5500µÄSCSΪ¸ßµçƽ
  12.         return i;//·µ»Ø¶ÁÈ¡µ½µÄ¼Ä´æÆ÷Êý¾Ý
  13. }
F103读出的i值是0xbf
我调试的时候
0.jpg
1.jpg
本来读出来的是1,可是执行完GPIO_SetBits(W5500_SCS_PORT, W5500_SCS);
就提示not in scope。
从仿真界面看,那两句
i=SPI_ReceiveData(SPI1);似乎执行不到。
请大神指教,谢谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

470

主题

3537

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部