搞了好长时间,一直没搞好。
这个SPI接口的W5500模块有例程,STM32F103C8T6,可以正常通信。
我现在用STM32F303ZET6搞。
用的SPI1,PA4,PA5,PA6,PA7.PA4是CS,自己控制,
PA5是SCLK,PA6是MISO,PA7是MOSI。
这部分初始代码为:
void SPI_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
SPI_InitTypeDef SPI_InitStructure;
RCC_APB2PeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_APB2Periph_SPI1 , ENABLE);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource5,GPIO_AF_5);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource6,GPIO_AF_5);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource7,GPIO_AF_5);
/* 3õê¼»ˉSCK¡¢MISO¡¢MOSIòy½Å */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
//GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOA,GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);
/* 3õê¼»ˉCSòy½Å */
GPIO_InitStructure.GPIO_Pin = W5500_SCS;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
GPIO_Init(W5500_SCS_PORT, &GPIO_InitStructure);
GPIO_SetBits(W5500_SCS_PORT, W5500_SCS);
/* 3õê¼»ˉÅäÖÃSTM32 SPI1 */
SPI_InitStructure.SPI_Direction=SPI_Direction_2Lines_FullDuplex; //SPIéèÖÃÎaË«ÏßË«Ïòè«Ë«1¤
SPI_InitStructure.SPI_Mode=SPI_Mode_Master; //éèÖÃÎaÖ÷SPI
SPI_InitStructure.SPI_DataSize=SPI_DataSize_8b; //SPI·¢Ëí½óêÕ8λ֡½á11
SPI_InitStructure.SPI_CPOL=SPI_CPOL_Low; //ê±ÖóDü¿Õμí
SPI_InitStructure.SPI_CPHA=SPI_CPHA_1Edge; //êy¾Y2¶»ñóúμú1¸öê±ÖóÑØ
SPI_InitStructure.SPI_NSS=SPI_NSS_Soft; //NSSóéía2¿1ü½Å1üàí
SPI_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_2; //2¨ìØÂêÔ¤·ÖÆμÖμÎa2
SPI_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB; //êy¾Y′«êä′óMSBλ¿aê¼
SPI_InitStructure.SPI_CRCPolynomial=7; //CRC¶àÏîê½Îa7
SPI_Init(SPI1,&SPI_InitStructure); //¸ù¾YSPI_InitStructÖDÖ¸¶¨μÄ2Îêy3õê¼»ˉíaéèSPI1¼Ä′æÆ÷
SPI_Cmd(SPI1,ENABLE); //STM32ê1ÄüSPI1
}
基本上照抄103的代码,做了一些修改。
我感觉这里可能有问题。
第二个可能有问题的地方是发送函数
void SPI1_Send_Byte(unsigned char dat)
{
SPI_I2S_SendData(SPI1,dat);//D′1¸ö×Ö½úêy¾Y
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);//μè′yêy¾Y¼Ä′æÆ÷¿Õ
}
第三个可能有问题的地方是接收函数
uint8_t SPI_ReceiveData(SPI_TypeDef* SPIx)
{
/* Check the parameters */
assert_param(IS_SPI_ALL_PERIPH(SPIx));
/* Return the data in the DR register */
return SPIx->DR;
}
还有一点,调试的时候,发现老是卡在这一个函数
void W5500_Hardware_Reset(void)
{
GPIO_ResetBits(W5500_RST_PORT, W5500_RST);//¸′λòy½Åà-μí
Delay(50);
GPIO_SetBits(W5500_RST_PORT, W5500_RST);//¸′λòy½Åà-¸ß
Delay(200);
while((Read_W5500_1Byte(PHYCFGR)&LINK)==0);//μè′yòÔì«íøᬽóíê3é
}
就是while循环那一句。
后来我跟踪调试,发现
unsigned char Read_W5500_1Byte(unsigned short reg)
{
unsigned char i;
GPIO_ResetBits(W5500_SCS_PORT, W5500_SCS);//ÖÃW5500μÄSCSÎaμíμçƽ
SPI1_Send_Short(reg);//í¨1ySPI1D′16λ¼Ä′æÆ÷μØÖ·
SPI1_Send_Byte(FDM1|RWB_READ|COMMON_R);//í¨1ySPI1D′¿ØÖÆ×Ö½ú,1¸ö×Ö½úêy¾Y3¤¶è,¶áêy¾Y,Ñ¡Ôñí¨óüÄ′æÆ÷
i=SPI_ReceiveData(SPI1);
SPI1_Send_Byte(0x00);//·¢Ëíò»¸öÑÆêy¾Y
i=SPI_ReceiveData(SPI1);//¶áè¡1¸ö×Ö½úêy¾Y
GPIO_SetBits(W5500_SCS_PORT, W5500_SCS);//ÖÃW5500μÄSCSÎa¸ßμçƽ
return i;//·μ»Ø¶áè¡μ½μļÄ′æÆ÷êy¾Y
}
F103读出的i值是0xbf
我调试的时候
本来读出来的是1,可是执行完GPIO_SetBits(W5500_SCS_PORT, W5500_SCS);
就提示not in scope。
从仿真界面看,那两句
i=SPI_ReceiveData(SPI1);似乎执行不到。
请大神指教,谢谢!
|