久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

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

  [復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:381818 發(fā)表于 2019-7-26 17:01 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
代碼親測有用,注釋詳細,可放心食用


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公共寄存器寫一個字節(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();                                                                                                                                                        /*片選拉高,關閉SPI通訊*/
  47. }
  48. /*****************************************************************************
  49.         *@brief        :                向W5500公共寄存器寫兩個字節(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();                                                                                                                                                        /*片選拉高,關閉SPI通訊*/
  62. }
  63. /*****************************************************************************
  64.         *@brief        :                向W5500公共寄存器寫N個字節(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();                                                                                                                                                        /*片選拉高,關閉SPI通訊*/
  81. }
  82. /*****************************************************************************
  83.         *@brief        :                讀W5500 common寄存器        1個字節(jié)數(shù)據(jù)
  84.         *@param        :                offest:        是基于公共寄存器基地址的偏移量
  85.         *@retval        :                一個字節(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();                                                                                                                                                        /*片選拉高,關閉SPI通訊*/
  95.         
  96.         return i;
  97. }
  98. /*****************************************************************************
  99.         *@brief        :                讀W5500 common寄存器        2個字節(jié)數(shù)據(jù)
  100.         *@param        :                offest:        是基于公共寄存器基地址的偏移量
  101.         *@retval        :                一個字節(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();                                                                                                                                                        /*片選拉高,關閉SPI通訊*/
  113.         
  114.         return i;
  115. }
  116. /*****************************************************************************
  117.         *@brief        :                向W5500 socket_n 寄存器寫1個字節(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();                                                                                                                                                        /*片選拉高,關閉SPI通訊*/               
  130. }
  131. /*****************************************************************************
  132.         *@brief        :                向W5500 socket_n 寄存器寫2個字節(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();                                                                                                                                                        /*片選拉高,關閉SPI通訊*/               
  146. }
  147. /*****************************************************************************
  148.         *@brief        :                向W5500 socket_n 寄存器寫N個字節(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();                                                                                                                                                        /*片選拉高,關閉SPI通訊*/               
  167. }

  168. /*****************************************************************************
  169.         *@brief        :                讀socket_n寄存器        1個字節(jié)數(shù)據(jù)
  170.         *@param        :                n                        :        選擇socket,取值0-7
  171.         *@param        :                offest:        是基于公共寄存器基地址的偏移量
  172.         *@retval        :                一個字節(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();                                                                                                                                                        /*片選拉高,關閉SPI通訊*/
  182.         return i;
  183. }
  184. /*****************************************************************************
  185.         *@brief        :                讀socket_n寄存器        2個字節(jié)數(shù)據(jù)
  186.         *@param        :                n                        :        選擇socket,取值0-7
  187.         *@param        :                offest:        是基于公共寄存器基地址的偏移量
  188.         *@retval        :                兩個字節(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();                                                                                                                                                        /*片選拉高,關閉SPI通訊*/
  200.         
  201.         return i;
  202. }
  203. /*****************************************************************************
  204.         *@brief        :                讀socket_n寄存器        n個字節(jié)數(shù)據(jù)
  205.         *@param        :                n                        :        選擇socket,取值0-7
  206.         *@param        :                offest:        是基于公共寄存器基地址的偏移量
  207.         *@param        :                addr        :        讀取到的數(shù)據(jù)保存的地址
  208.         *@param        :                size        :        讀取的字節(jié)數(shù)
  209.         *@retval        :                一個字節(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();                                                                                                                                                        /*片選拉高,關閉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代碼及英文數(shù)據(jù)手冊.7z (1.46 MB, 下載次數(shù): 221)


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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91麻豆精品国产91久久久久久久久 | 午夜视频在线 | 中文字幕在线第二页 | 三级在线免费 | 欧美一区二区免费 | 97成人在线 | 三级成人片| 99re在线播放 | 精品久久久久久国产 | 超碰在线人人 | 久久国产精品精品 | 在线播放精品视频 | 久久久免费电影 | 午夜激情免费 | 国产99免费视频 | 一区二区三区在线观看免费视频 | 欧美色综合一区二区三区 | 一区二区精品 | 红桃视频一区二区三区免费 | 色橹橹欧美在线观看视频高清 | 在线观看av网站 | 91精品国产综合久久福利软件 | 欧美激情久久久 | 在线视频一区二区 | 伊人精品在线 | 久久久久电影 | 日韩另类 | 七七婷婷婷婷精品国产 | 亚洲精品黄色 | 久久网站黄 | 国产福利在线播放 | 日韩精品一区二区三区 | 999久久久久久久 | 午夜在线免费观看 | 亚洲欧美在线视频 | 精品入口麻豆88视频 | 免费成年网站 | 成人激情视频在线 | 欧美久久一区二区 | av官网在线 | 日本不卡一区二区三区 |