找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5641|回复: 5
收起左侧

前两天做W5500的小项目,自己写了驱动和库,有详细的注释,模式SPI与硬件SPI都有

  [复制链接]
ID:381818 发表于 2019-7-26 17:01 | 显示全部楼层 |阅读模式
代码亲测有用,注释详细,可放心食用
0.png

STM32单片机源程序如下:
  1. #include "bsp_w5500.h"
  2. #include "bsp_spi.h"
  3. #include "bsp_systick.h"
  4. #include "bsp_w5500_int.h"
  5. /***********************-CS引脚与RST引脚配置-****************************/
  6. static void W5500_GPIO_Config()
  7. {
  8.         GPIO_InitTypeDef             GPIO_InitStruct;
  9.         RCC_APB2PeriphClockCmd(W5500_CS_CLK|W5500_RST_CLK,ENABLE);
  10.         /*CS引脚配置*/
  11.         GPIO_InitStruct.GPIO_Pin=W5500_CS_Pin;
  12.         GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
  13.         GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
  14.         GPIO_Init(W5500_CS_Port,&GPIO_InitStruct);
  15.         /*RST引脚配置*/
  16.         GPIO_InitStruct.GPIO_Pin=W5500_RST_Pin;
  17.         GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
  18.         GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
  19.         GPIO_Init(W5500_RST_Port,&GPIO_InitStruct);

  20.         W5500_CS_High();
  21. }
  22. /*****************************************************************************
  23.         *@brief        :                W5500硬件复位
  24.         *@param        :                 
  25.         *@retval        :                none
  26. *****************************************************************************/
  27. static void W5500_HardWare_Reset(void)
  28. {
  29.         W5500_RST_Low();
  30.         delay_ms(5);
  31.         W5500_RST_High();
  32.         delay_ms(5);
  33. }
  34. /*****************************************************************************
  35.         *@brief        :                向W5500公共寄存器写一个字节数据
  36.         *@param        :                offest:        是基于公共寄存器基地址的偏移量
  37.         *@param        :   data        :        将要向寄存器写入的数据
  38.         *@retval        :                none
  39. *****************************************************************************/
  40. void W5500_Write1Byte_common(uint16_t offest,uint8_t data)
  41. {
  42.         W5500_CS_Low();                                                                                                                                                                /*CS片选置底,开始SPI通讯*/
  43.         SPI1_Send_Short(offest);                                                                                                                        /*发送16位地址*/
  44.         SPI1_Send_Byte((uint8_t) (COMMON_R|RWB_WRITE|VDM));                /*发送控制字节*/
  45.         SPI1_Send_Byte(data);                                                                                                                                        /*发送8位数据*/
  46.         W5500_CS_High();                                                                                                                                                        /*片选拉高,关闭SPI通讯*/
  47. }
  48. /*****************************************************************************
  49.         *@brief        :                向W5500公共寄存器写两个字节数据
  50.         *@param        :                offest:        是基于公共寄存器基地址的偏移量
  51.         *@param        :   data        :        将要向寄存器写入的数据
  52.         *@retval        :                none
  53. *****************************************************************************/
  54. void W5500_Write2Byte_common(uint16_t offest,uint16_t data)
  55. {
  56.         W5500_CS_Low();                                                                                                                                                                /*CS片选置底,开始SPI通讯*/
  57.         SPI1_Send_Short(offest);                                                                                                                        /*发送16位地址*/
  58.         SPI1_Send_Byte((uint8_t) (COMMON_R|RWB_WRITE|VDM));                /*发送控制字节*/
  59.         SPI1_Send_Byte((uint8_t)(data/256));                                                                        /*发送高8位数据*/
  60.         SPI1_Send_Byte((uint8_t)(data%256));                                                                        /*发送低8位数据*/
  61.         W5500_CS_High();                                                                                                                                                        /*片选拉高,关闭SPI通讯*/
  62. }
  63. /*****************************************************************************
  64.         *@brief        :                向W5500公共寄存器写N个字节数据
  65.         *@param        :                offest:        是基于公共寄存器基地址的偏移量
  66.         *@param        :   addr        :        将要向寄存器写入的数据的地址
  67.         *@param        :   size        :        将要向寄存器写入的数据字节数
  68.         *@retval        :                none
  69. *****************************************************************************/
  70. void W5500_WriteNByte_common(uint16_t offest,uint8_t *addr,uint8_t size)
  71. {
  72.         uint8_t i;
  73.         W5500_CS_Low();                                                                                                                                                                /*CS片选置底,开始SPI通讯*/
  74.         SPI1_Send_Short(offest);                                                                                                                        /*发送16位地址*/
  75.         SPI1_Send_Byte((uint8_t) (COMMON_R|RWB_WRITE|VDM));                /*发送控制字节*/
  76.         for(i=0;i<size;i++)                                                                                                                                                /*发送数据*/
  77.         {
  78.                 SPI1_Send_Byte(*addr++);
  79.         }
  80.         W5500_CS_High();                                                                                                                                                        /*片选拉高,关闭SPI通讯*/
  81. }
  82. /*****************************************************************************
  83.         *@brief        :                读W5500 common寄存器        1个字节数据
  84.         *@param        :                offest:        是基于公共寄存器基地址的偏移量
  85.         *@retval        :                一个字节的数据
  86. *****************************************************************************/
  87. uint8_t W5500_Read1Byte_common(uint16_t offest)
  88. {
  89.         uint8_t i;
  90.         W5500_CS_Low();                                                                                                                                                                /*CS片选置底,开始SPI通讯*/
  91.         SPI1_Send_Short(offest);                                                                                                                        /*发送16位地址*/
  92.         SPI1_Send_Byte(COMMON_R|RWB_READ|VDM);                                                                /*发送控制字节*/
  93.         i=SPI1_Read_Byte();                                                                                                                                                /*接收数据*/
  94.         W5500_CS_High();                                                                                                                                                        /*片选拉高,关闭SPI通讯*/
  95.         
  96.         return i;
  97. }
  98. /*****************************************************************************
  99.         *@brief        :                读W5500 common寄存器        2个字节数据
  100.         *@param        :                offest:        是基于公共寄存器基地址的偏移量
  101.         *@retval        :                一个字节的数据
  102. *****************************************************************************/
  103. uint16_t W5500_Read2Byte_common(uint16_t offest)
  104. {
  105.         uint16_t i;
  106.         W5500_CS_Low();                                                                                                                                                                /*CS片选置底,开始SPI通讯*/
  107.         SPI1_Send_Short(offest);                                                                                                                        /*发送16位地址*/
  108.         SPI1_Send_Byte(COMMON_R|RWB_READ|VDM);                                                                /*发送控制字节*/
  109.         i=SPI1_Read_Byte();                                                                                                                                                /*接收数据*/
  110.         i*=256;
  111.         i|=SPI1_Read_Byte();
  112.         W5500_CS_High();                                                                                                                                                        /*片选拉高,关闭SPI通讯*/
  113.         
  114.         return i;
  115. }
  116. /*****************************************************************************
  117.         *@brief        :                向W5500 socket_n 寄存器写1个字节数据
  118.         *@param        :                n                        :        选择socket_n寄存器,取值范围0—7
  119.         *@param        :                offest:        是基于socket_n寄存器基地址的偏移量
  120.         *@param        :          data        :        将要向寄存器写入的数据
  121.         *@retval        :                none
  122. *****************************************************************************/
  123. void W5500_Write1Byte_socket_n(uint8_t n,uint16_t offest,uint8_t data)
  124. {
  125.         W5500_CS_Low();                                                                                                                                                                /*CS片选置底,开始SPI通讯*/
  126.         SPI1_Send_Short(offest);                                                                                                                        /*发送16位地址*/
  127.         SPI1_Send_Byte((uint8_t) (n*0x20+0x08|RWB_WRITE|VDM));/*发送控制字节*/
  128.         SPI1_Send_Byte(data);                                                                                                                                        /*发送8位数据*/
  129.         W5500_CS_High();                                                                                                                                                        /*片选拉高,关闭SPI通讯*/               
  130. }
  131. /*****************************************************************************
  132.         *@brief        :                向W5500 socket_n 寄存器写2个字节数据
  133.         *@param        :                n                        :        选择socket_n寄存器,取值范围0—7
  134.         *@param        :                offest:        是基于socket_n寄存器基地址的偏移量
  135.         *@param        :          data        :        将要向寄存器写入的数据
  136.         *@retval        :                none
  137. *****************************************************************************/
  138. void W5500_Write2Byte_socket_n(uint8_t n,uint16_t offest,uint16_t data)
  139. {
  140.         W5500_CS_Low();                                                                                                                                                                /*CS片选置底,开始SPI通讯*/
  141.         SPI1_Send_Short(offest);                                                                                                                        /*发送16位地址*/
  142.         SPI1_Send_Byte((uint8_t) (n*0x20+0x08|RWB_WRITE|VDM));/*发送控制字节*/
  143.         SPI1_Send_Byte((uint8_t)(data/256));                                                                        /*发送高8位数据*/
  144.         SPI1_Send_Byte((uint8_t)(data%256));                                                                        /*发送低8位数据*/
  145.         W5500_CS_High();                                                                                                                                                        /*片选拉高,关闭SPI通讯*/               
  146. }
  147. /*****************************************************************************
  148.         *@brief        :                向W5500 socket_n 寄存器写N个字节数据
  149.         *@param        :                n                        :        选择socket_n寄存器,取值范围0—7
  150.         *@param        :                offest:        是基于socket_n寄存器基地址的偏移量
  151.         *@param        :                addr        :        写入数据的地址
  152.         *@param        :          size        :        写入的数据字节数
  153.         *@retval        :                none
  154. *****************************************************************************/
  155. void W5500_WriteNByte_socket_n(uint8_t n,uint16_t offest,uint8_t* addr,uint8_t size)
  156. {
  157.         uint8_t i;
  158.         W5500_CS_Low();                                                                                                                                                                /*CS片选置底,开始SPI通讯*/
  159.         SPI1_Send_Short(offest);                                                                                                                        /*发送16位地址*/
  160.         SPI1_Send_Byte((uint8_t) (n*0x20+0x08|RWB_WRITE|VDM));/*发送控制字节*/
  161.         for(i=0;i<size;i++)                                                                                                                                                /*发送数据*/
  162.         {
  163.                 SPI1_Send_Byte(*addr);
  164.                 addr++;
  165.         }
  166.         W5500_CS_High();                                                                                                                                                        /*片选拉高,关闭SPI通讯*/               
  167. }

  168. /*****************************************************************************
  169.         *@brief        :                读socket_n寄存器        1个字节数据
  170.         *@param        :                n                        :        选择socket,取值0-7
  171.         *@param        :                offest:        是基于公共寄存器基地址的偏移量
  172.         *@retval        :                一个字节的数据
  173. *****************************************************************************/
  174. uint8_t W5500_Read1Byte_socket_n(uint8_t n,uint16_t offest)
  175. {
  176.         uint8_t        i;
  177.         W5500_CS_Low();                                                                                                                                                                /*CS片选置底,开始SPI通讯*/
  178.         SPI1_Send_Short(offest);                                                                                                                        /*发送16位地址*/
  179.         SPI1_Send_Byte((n*0x20+0x08)|RWB_READ|VDM);                                                /*发送控制字节*/
  180.         i=SPI1_Read_Byte();                                                                                                                                                /*接收数据*/
  181.         W5500_CS_High();                                                                                                                                                        /*片选拉高,关闭SPI通讯*/
  182.         return i;
  183. }
  184. /*****************************************************************************
  185.         *@brief        :                读socket_n寄存器        2个字节数据
  186.         *@param        :                n                        :        选择socket,取值0-7
  187.         *@param        :                offest:        是基于公共寄存器基地址的偏移量
  188.         *@retval        :                两个字节的数据
  189. *****************************************************************************/
  190. uint16_t W5500_Read2Byte_socket_n(uint8_t n,uint16_t offest)
  191. {
  192.         uint16_t        i;
  193.         W5500_CS_Low();                                                                                                                                                                /*CS片选置底,开始SPI通讯*/
  194.         SPI1_Send_Short(offest);                                                                                                                        /*发送16位地址*/
  195.         SPI1_Send_Byte((n*0x20+0x08)|RWB_READ|VDM);                                                /*发送控制字节*/
  196.         i=SPI1_Read_Byte();                                                                                                                                                /*接收数据*/
  197.         i*=256;
  198.         i|=SPI1_Read_Byte();
  199.         W5500_CS_High();                                                                                                                                                        /*片选拉高,关闭SPI通讯*/
  200.         
  201.         return i;
  202. }
  203. /*****************************************************************************
  204.         *@brief        :                读socket_n寄存器        n个字节数据
  205.         *@param        :                n                        :        选择socket,取值0-7
  206.         *@param        :                offest:        是基于公共寄存器基地址的偏移量
  207.         *@param        :                addr        :        读取到的数据保存的地址
  208.         *@param        :                size        :        读取的字节数
  209.         *@retval        :                一个字节的数据
  210. *****************************************************************************/
  211. void W5500_ReadNByte_socket_n(uint8_t n,uint16_t offest,uint8_t* addr,uint8_t size)
  212. {
  213.         uint8_t i;
  214.         W5500_CS_Low();                                                                                                                                                                /*CS片选置底,开始SPI通讯*/
  215.         SPI1_Send_Short(offest);                                                                                                                        /*发送16位地址*/
  216.         SPI1_Send_Byte((n*0x20+0x08)|RWB_READ|VDM);                                                /*发送控制字节*/
  217.         for(i=0;i<size;i++)                                                                                                                                                /*接收数据*/
  218.         {
  219.                 *addr=SPI1_Read_Byte();
  220.                 addr++;
  221.         }
  222.         W5500_CS_High();                                                                                                                                                        /*片选拉高,关闭SPI通讯*/
  223. }
  224. /*****************************************************************************
  225.         *@brief        :                W5500软件复位
  226.         *@param        :                 
  227.         *@retval        :                none
  228. *****************************************************************************/
  229. static void W5500_Soft_Reset()
  230. {
  231.         W5500_Write1Byte_common(MR,RST);
  232.         delay_ms(5);
  233. }
  234. void W5500_Init()
  235. {

  236.         SPI_Config();
  237.         W5500_GPIO_Config();
  238.         W5500_INT_GPIO_Config();
  239.         W5500_HardWare_Reset();
  240.         W5500_Soft_Reset();
  241. }
复制代码

所有资料51hei提供下载:
W5500代码及英文数据手册.7z (1.46 MB, 下载次数: 208)
回复

使用道具 举报

ID:585455 发表于 2019-8-19 22:03 | 显示全部楼层
測試可用
非常感謝
回复

使用道具 举报

ID:20672 发表于 2019-11-22 20:49 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:456205 发表于 2019-12-13 09:06 | 显示全部楼层
正在学习,非常谢谢
回复

使用道具 举报

ID:491492 发表于 2020-4-25 14:14 | 显示全部楼层
感谢大佬
回复

使用道具 举报

ID:216265 发表于 2024-4-17 14:49 | 显示全部楼层
感谢,正好我调不通SPI2
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表