打印
[STM32F1]

STM32F103驱动W5500程序的问题

[复制链接]
362|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
比神乐|  楼主 | 2023-1-15 16:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用STM32驱动W5500成功了,不过成立有个地方不明白,想请教大家。
unsigned char Read_W5500_1Byte(unsigned short reg)
{
        unsigned char i;

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

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

        GPIO_SetBits(W5500_SCS_PORT, W5500_SCS);//ÖÃW5500µÄSCSΪ¸ßµçƽ
        return i;//·µ»Ø¶ÁÈ¡µ½µÄ¼Ä´æÆ÷Êý¾Ý
}

请问红色的那句有什么作用?我看不懂,请指教,谢谢!

使用特权

评论回复
沙发
天天向善| | 2023-1-16 09:55 | 只看该作者
读两遍有什么特殊要求???

使用特权

评论回复
板凳
Pretext| | 2023-1-16 09:55 | 只看该作者
是为了只读低字节的吧?

使用特权

评论回复
地板
芯路例程| | 2023-1-16 09:55 | 只看该作者
有没可能寄存器是2个字节的,只有第二个字节有用?

使用特权

评论回复
5
比神乐|  楼主 | 2023-1-16 10:33 | 只看该作者
谢谢各位的回复!如果是为了只读第二个字节。那么读第一个字节也应该先发送一个SPI1_Send_Byte(0x00);//发送一个哑数据吧,就像读第二个字节一样。

使用特权

评论回复
6
timerc| | 2023-1-16 11:19 | 只看该作者
可能存在dummy byte,搞一个dummy byte 进去,然后读取的才是正确数据吧

使用特权

评论回复
7
forgot| | 2023-1-16 14:12 | 只看该作者
我平时用的这份.c,注释里写了Write a dummy byte
/* Read W5500 Socket register 1 Byte */
unsigned char Read_SOCK_1_Byte(SOCKET s, unsigned short reg)
{
    unsigned char i;

    /* Set W5500 SCS Low */
    W5500_SCS_LOW;

    /* Write Address */
    SPI_I2S_SendData(SPI2,reg/256);
    while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
    SPI_I2S_SendData(SPI2,reg);
    while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);

    /* Write Control Byte */
    SPI_I2S_SendData(SPI2,(FDM1|RWB_READ|(s*0x20+0x08)));
    while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);

    /* Write a dummy byte */
    i=SPI_I2S_ReceiveData(SPI2);
    SPI_I2S_SendData(SPI2,0x00);
    while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);

    /* Read 1 byte */
    i=SPI_I2S_ReceiveData(SPI2);

    /* Set W5500 SCS High*/
    W5500_SCS_HIGH;
    return i;
}


使用特权

评论回复
8
gxs64| | 2023-1-16 14:39 | 只看该作者
你这个程序不对,不是w5500的例程。

使用特权

评论回复
9
比神乐|  楼主 | 2023-1-16 16:00 | 只看该作者
gxs64 发表于 2023-1-16 14:39
你这个程序不对,不是w5500的例程。

怎么不对?我都试验成功了·。这是我买SPI接口·网口的时候·送的资料。

使用特权

评论回复
10
比神乐|  楼主 | 2023-1-16 16:05 | 只看该作者
forgot 发表于 2023-1-16 14:12
我平时用的这份.c,注释里写了Write a dummy byte

我感觉到跟我的差不多。你开始发的两个字节,我那个
SPI1_Send_Short(reg);//ͨ¹ýSPI1д16λ¼Ä´æÆ÷µØÖ·
这个函数就是连续发两个字节的函数。

使用特权

评论回复
11
比神乐|  楼主 | 2023-1-16 16:11 | 只看该作者
这两个函数不一样,我那个是读W5500一个字节,你的是读Read_SOCK_1_Byte。
我的程序里也有Read_SOCK_1_Byte的函数
/*******************************************************************************
* º¯ÊýÃû  : Read_W5500_SOCK_1Byte
* ÃèÊö    : ¶ÁW5500Ö¸¶¨¶Ë¿Ú¼Ä´æÆ÷µÄ1¸ö×Ö½ÚÊý¾Ý
* ÊäÈë    : s:¶Ë¿ÚºÅ,reg:16λ¼Ä´æÆ÷µØÖ·
* Êä³ö    : ÎÞ
* ·µ»ØÖµ  : ¶ÁÈ¡µ½¼Ä´æÆ÷µÄ1¸ö×Ö½ÚÊý¾Ý
* ˵Ã÷    : ÎÞ
*******************************************************************************/
unsigned char Read_W5500_SOCK_1Byte(SOCKET s, unsigned short reg)
{
        unsigned char i;

        GPIO_ResetBits(W5500_SCS_PORT, W5500_SCS);//ÖÃW5500µÄSCSΪµÍµçƽ
                       
        SPI1_Send_Short(reg);//ͨ¹ýSPI1д16λ¼Ä´æÆ÷µØÖ·
        SPI1_Send_Byte(FDM1|RWB_READ|(s*0x20+0x08));//ͨ¹ýSPI1д¿ØÖÆ×Ö½Ú,1¸ö×Ö½ÚÊý¾Ý³¤¶È,¶ÁÊý¾Ý,Ñ¡Ôñ¶Ë¿ÚsµÄ¼Ä´æÆ÷

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

        GPIO_SetBits(W5500_SCS_PORT, W5500_SCS);//ÖÃW5500µÄSCSΪ¸ßµçƽ
        return i;//·µ»Ø¶ÁÈ¡µ½µÄ¼Ä´æÆ÷Êý¾Ý
}

不是一个函数。函数名都不一样

使用特权

评论回复
12
timerc| | 2023-1-16 16:36 | 只看该作者
本帖最后由 timerc 于 2023-1-16 17:05 编辑

要不然你把这句话注释掉试试,或者这个函数的内容发来看看网上找了个源码看了下,这个只是读取SPI的DR寄存器,应该只是清一下DR吧,清一下RXNE吧,HAL库里面有对RXNE进行判断,这里直接通过这句话清掉RXNE,达到一个效果,应该是STM32需要这样的操作
/* Wait until RXNE flag is reset */
      if ((__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_RXNE)) && (hspi->RxXferCount > 0U))
      {
        (*(uint8_t *)hspi->pRxBuffPtr) = hspi->Instance->DR;
        hspi->pRxBuffPtr++;
        hspi->RxXferCount--;
        /* Next Data is a Transmission (Tx). Tx is allowed */
        txallowed = 1U;
      }




使用特权

评论回复
13
gxs64| | 2023-1-16 18:59 | 只看该作者
比神乐 发表于 2023-1-16 16:00
怎么不对?我都试验成功了·。这是我买SPI接口·网口的时候·送的资料。

以前我也是你这样,在某些情况下出错。商家的不可靠,很多有问题。建议你在QQ群里下载,好象有,而且还全,Client ,Server,广播模式都有。21IC图站有问题,附件传不上来。

使用特权

评论回复
14
gxs64| | 2023-1-16 19:01 | 只看该作者
比神乐 发表于 2023-1-16 16:00
怎么不对?我都试验成功了·。这是我买SPI接口·网口的时候·送的资料。

在QQ群里下载,很全,都有。

使用特权

评论回复
15
比神乐|  楼主 | 2023-1-16 20:19 | 只看该作者
timerc 发表于 2023-1-16 16:36
要不然你把这句话注释掉试试,或者这个函数的内容发来看看网上找了个源码看了下,这个只是读取SPI的 ...

谢谢!我STM32搞成功了,现在用新定义的片子做实验。

使用特权

评论回复
16
比神乐|  楼主 | 2023-1-16 20:30 | 只看该作者
timerc 发表于 2023-1-16 16:36
要不然你把这句话注释掉试试,或者这个函数的内容发来看看网上找了个源码看了下,这个只是读取SPI的 ...

uint16_t SPI_I2S_ReceiveData(SPI_TypeDef* SPIx)
{
  /* Check the parameters */
  assert_param(IS_SPI_ALL_PERIPH(SPIx));
  
  /* Return the data in the DR register */
  return SPIx->DR;
}

使用特权

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

本版积分规则

337

主题

3057

帖子

7

粉丝