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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7384|回復: 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, 下載次數: 221)


回復

使用道具 舉報

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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲视频一区在线 | 国产精品一区二区福利视频 | 国产欧美精品 | 欧美久久久网站 | 久久亚| 狠狠综合久久av一区二区老牛 | 国产aⅴ爽av久久久久久久 | 欧美日韩中文字幕在线播放 | 日韩av成人在线观看 | 521av网站 | 99热这里有精品 | 精品国产91乱码一区二区三区 | 欧美操操操 | 亚洲成人日韩 | 东京久久 | 日韩欧美一区二区三区四区 | 久久久国产一区二区三区四区小说 | 韩日精品一区 | 欧美精品国产精品 | 国产一级特黄aaa大片评分 | 男人的天堂中文字幕 | 亚洲精品视频免费观看 | 一级黄色录像片子 | 国产女人与拘做受视频 | 狠狠狠色丁香婷婷综合久久五月 | 福利网址| 亚洲午夜精品一区二区三区他趣 | 精品动漫一区 | 久久综合影院 | 成年人黄色一级片 | 天堂久久网| 中文字幕av网 | 波多野结衣在线观看一区二区三区 | 91久久久久久久久 | 2019天天操 | 91av国产在线视频 | 一区在线观看视频 | 中文字幕一区二区三区乱码在线 | 亚洲午夜视频在线观看 | 一级片免费网站 | 国产欧美在线观看 |