找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7288|回復(fù): 5
打印 上一主題 下一主題
收起左側(cè)

前兩天做W5500的小項(xiàng)目,自己寫了驅(qū)動(dòng)和庫,有詳細(xì)的注釋,模式SPI與硬件SPI都有

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
代碼親測有用,注釋詳細(xì),可放心食用


STM32單片機(jī)源程序如下:
  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硬件復(fù)位
  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公共寄存器寫一個(gè)字節(jié)數(shù)據(jù)
  36.         *@param        :                offest:        是基于公共寄存器基地址的偏移量
  37.         *@param        :   data        :        將要向寄存器寫入的數(shù)據(jù)
  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);                                                                                                                        /*發(fā)送16位地址*/
  44.         SPI1_Send_Byte((uint8_t) (COMMON_R|RWB_WRITE|VDM));                /*發(fā)送控制字節(jié)*/
  45.         SPI1_Send_Byte(data);                                                                                                                                        /*發(fā)送8位數(shù)據(jù)*/
  46.         W5500_CS_High();                                                                                                                                                        /*片選拉高,關(guān)閉SPI通訊*/
  47. }
  48. /*****************************************************************************
  49.         *@brief        :                向W5500公共寄存器寫兩個(gè)字節(jié)數(shù)據(jù)
  50.         *@param        :                offest:        是基于公共寄存器基地址的偏移量
  51.         *@param        :   data        :        將要向寄存器寫入的數(shù)據(jù)
  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);                                                                                                                        /*發(fā)送16位地址*/
  58.         SPI1_Send_Byte((uint8_t) (COMMON_R|RWB_WRITE|VDM));                /*發(fā)送控制字節(jié)*/
  59.         SPI1_Send_Byte((uint8_t)(data/256));                                                                        /*發(fā)送高8位數(shù)據(jù)*/
  60.         SPI1_Send_Byte((uint8_t)(data%256));                                                                        /*發(fā)送低8位數(shù)據(jù)*/
  61.         W5500_CS_High();                                                                                                                                                        /*片選拉高,關(guān)閉SPI通訊*/
  62. }
  63. /*****************************************************************************
  64.         *@brief        :                向W5500公共寄存器寫N個(gè)字節(jié)數(shù)據(jù)
  65.         *@param        :                offest:        是基于公共寄存器基地址的偏移量
  66.         *@param        :   addr        :        將要向寄存器寫入的數(shù)據(jù)的地址
  67.         *@param        :   size        :        將要向寄存器寫入的數(shù)據(jù)字節(jié)數(shù)
  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);                                                                                                                        /*發(fā)送16位地址*/
  75.         SPI1_Send_Byte((uint8_t) (COMMON_R|RWB_WRITE|VDM));                /*發(fā)送控制字節(jié)*/
  76.         for(i=0;i<size;i++)                                                                                                                                                /*發(fā)送數(shù)據(jù)*/
  77.         {
  78.                 SPI1_Send_Byte(*addr++);
  79.         }
  80.         W5500_CS_High();                                                                                                                                                        /*片選拉高,關(guān)閉SPI通訊*/
  81. }
  82. /*****************************************************************************
  83.         *@brief        :                讀W5500 common寄存器        1個(gè)字節(jié)數(shù)據(jù)
  84.         *@param        :                offest:        是基于公共寄存器基地址的偏移量
  85.         *@retval        :                一個(gè)字節(jié)的數(shù)據(jù)
  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);                                                                                                                        /*發(fā)送16位地址*/
  92.         SPI1_Send_Byte(COMMON_R|RWB_READ|VDM);                                                                /*發(fā)送控制字節(jié)*/
  93.         i=SPI1_Read_Byte();                                                                                                                                                /*接收數(shù)據(jù)*/
  94.         W5500_CS_High();                                                                                                                                                        /*片選拉高,關(guān)閉SPI通訊*/
  95.         
  96.         return i;
  97. }
  98. /*****************************************************************************
  99.         *@brief        :                讀W5500 common寄存器        2個(gè)字節(jié)數(shù)據(jù)
  100.         *@param        :                offest:        是基于公共寄存器基地址的偏移量
  101.         *@retval        :                一個(gè)字節(jié)的數(shù)據(jù)
  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);                                                                                                                        /*發(fā)送16位地址*/
  108.         SPI1_Send_Byte(COMMON_R|RWB_READ|VDM);                                                                /*發(fā)送控制字節(jié)*/
  109.         i=SPI1_Read_Byte();                                                                                                                                                /*接收數(shù)據(jù)*/
  110.         i*=256;
  111.         i|=SPI1_Read_Byte();
  112.         W5500_CS_High();                                                                                                                                                        /*片選拉高,關(guān)閉SPI通訊*/
  113.         
  114.         return i;
  115. }
  116. /*****************************************************************************
  117.         *@brief        :                向W5500 socket_n 寄存器寫1個(gè)字節(jié)數(shù)據(jù)
  118.         *@param        :                n                        :        選擇socket_n寄存器,取值范圍0—7
  119.         *@param        :                offest:        是基于socket_n寄存器基地址的偏移量
  120.         *@param        :          data        :        將要向寄存器寫入的數(shù)據(jù)
  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);                                                                                                                        /*發(fā)送16位地址*/
  127.         SPI1_Send_Byte((uint8_t) (n*0x20+0x08|RWB_WRITE|VDM));/*發(fā)送控制字節(jié)*/
  128.         SPI1_Send_Byte(data);                                                                                                                                        /*發(fā)送8位數(shù)據(jù)*/
  129.         W5500_CS_High();                                                                                                                                                        /*片選拉高,關(guān)閉SPI通訊*/               
  130. }
  131. /*****************************************************************************
  132.         *@brief        :                向W5500 socket_n 寄存器寫2個(gè)字節(jié)數(shù)據(jù)
  133.         *@param        :                n                        :        選擇socket_n寄存器,取值范圍0—7
  134.         *@param        :                offest:        是基于socket_n寄存器基地址的偏移量
  135.         *@param        :          data        :        將要向寄存器寫入的數(shù)據(jù)
  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);                                                                                                                        /*發(fā)送16位地址*/
  142.         SPI1_Send_Byte((uint8_t) (n*0x20+0x08|RWB_WRITE|VDM));/*發(fā)送控制字節(jié)*/
  143.         SPI1_Send_Byte((uint8_t)(data/256));                                                                        /*發(fā)送高8位數(shù)據(jù)*/
  144.         SPI1_Send_Byte((uint8_t)(data%256));                                                                        /*發(fā)送低8位數(shù)據(jù)*/
  145.         W5500_CS_High();                                                                                                                                                        /*片選拉高,關(guān)閉SPI通訊*/               
  146. }
  147. /*****************************************************************************
  148.         *@brief        :                向W5500 socket_n 寄存器寫N個(gè)字節(jié)數(shù)據(jù)
  149.         *@param        :                n                        :        選擇socket_n寄存器,取值范圍0—7
  150.         *@param        :                offest:        是基于socket_n寄存器基地址的偏移量
  151.         *@param        :                addr        :        寫入數(shù)據(jù)的地址
  152.         *@param        :          size        :        寫入的數(shù)據(jù)字節(jié)數(shù)
  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);                                                                                                                        /*發(fā)送16位地址*/
  160.         SPI1_Send_Byte((uint8_t) (n*0x20+0x08|RWB_WRITE|VDM));/*發(fā)送控制字節(jié)*/
  161.         for(i=0;i<size;i++)                                                                                                                                                /*發(fā)送數(shù)據(jù)*/
  162.         {
  163.                 SPI1_Send_Byte(*addr);
  164.                 addr++;
  165.         }
  166.         W5500_CS_High();                                                                                                                                                        /*片選拉高,關(guān)閉SPI通訊*/               
  167. }

  168. /*****************************************************************************
  169.         *@brief        :                讀socket_n寄存器        1個(gè)字節(jié)數(shù)據(jù)
  170.         *@param        :                n                        :        選擇socket,取值0-7
  171.         *@param        :                offest:        是基于公共寄存器基地址的偏移量
  172.         *@retval        :                一個(gè)字節(jié)的數(shù)據(jù)
  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);                                                                                                                        /*發(fā)送16位地址*/
  179.         SPI1_Send_Byte((n*0x20+0x08)|RWB_READ|VDM);                                                /*發(fā)送控制字節(jié)*/
  180.         i=SPI1_Read_Byte();                                                                                                                                                /*接收數(shù)據(jù)*/
  181.         W5500_CS_High();                                                                                                                                                        /*片選拉高,關(guān)閉SPI通訊*/
  182.         return i;
  183. }
  184. /*****************************************************************************
  185.         *@brief        :                讀socket_n寄存器        2個(gè)字節(jié)數(shù)據(jù)
  186.         *@param        :                n                        :        選擇socket,取值0-7
  187.         *@param        :                offest:        是基于公共寄存器基地址的偏移量
  188.         *@retval        :                兩個(gè)字節(jié)的數(shù)據(jù)
  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);                                                                                                                        /*發(fā)送16位地址*/
  195.         SPI1_Send_Byte((n*0x20+0x08)|RWB_READ|VDM);                                                /*發(fā)送控制字節(jié)*/
  196.         i=SPI1_Read_Byte();                                                                                                                                                /*接收數(shù)據(jù)*/
  197.         i*=256;
  198.         i|=SPI1_Read_Byte();
  199.         W5500_CS_High();                                                                                                                                                        /*片選拉高,關(guān)閉SPI通訊*/
  200.         
  201.         return i;
  202. }
  203. /*****************************************************************************
  204.         *@brief        :                讀socket_n寄存器        n個(gè)字節(jié)數(shù)據(jù)
  205.         *@param        :                n                        :        選擇socket,取值0-7
  206.         *@param        :                offest:        是基于公共寄存器基地址的偏移量
  207.         *@param        :                addr        :        讀取到的數(shù)據(jù)保存的地址
  208.         *@param        :                size        :        讀取的字節(jié)數(shù)
  209.         *@retval        :                一個(gè)字節(jié)的數(shù)據(jù)
  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);                                                                                                                        /*發(fā)送16位地址*/
  216.         SPI1_Send_Byte((n*0x20+0x08)|RWB_READ|VDM);                                                /*發(fā)送控制字節(jié)*/
  217.         for(i=0;i<size;i++)                                                                                                                                                /*接收數(shù)據(jù)*/
  218.         {
  219.                 *addr=SPI1_Read_Byte();
  220.                 addr++;
  221.         }
  222.         W5500_CS_High();                                                                                                                                                        /*片選拉高,關(guān)閉SPI通訊*/
  223. }
  224. /*****************************************************************************
  225.         *@brief        :                W5500軟件復(fù)位
  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. }
復(fù)制代碼

所有資料51hei提供下載:
W5500代碼及英文數(shù)據(jù)手冊.7z (1.46 MB, 下載次數(shù): 221)


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏7 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:585455 發(fā)表于 2019-8-19 22:03 | 只看該作者
測試可用
非常感謝
回復(fù)

使用道具 舉報(bào)

板凳
ID:20672 發(fā)表于 2019-11-22 20:49 | 只看該作者
謝謝分享
回復(fù)

使用道具 舉報(bào)

地板
ID:456205 發(fā)表于 2019-12-13 09:06 | 只看該作者
正在學(xué)習(xí),非常謝謝
回復(fù)

使用道具 舉報(bào)

5#
ID:491492 發(fā)表于 2020-4-25 14:14 | 只看該作者
感謝大佬
回復(fù)

使用道具 舉報(bào)

6#
ID:216265 發(fā)表于 2024-4-17 14:49 | 只看該作者
感謝,正好我調(diào)不通SPI2
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表