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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7284|回復: 5
打印 上一主題 下一主題
收起左側

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

  [復制鏈接]
跳轉到指定樓層
樓主
代碼親測有用,注釋詳細,可放心食用


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)


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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美精品一区三区 | 国产乱码精品一区二区三区五月婷 | 中文字幕日韩欧美一区二区三区 | 一本大道久久a久久精二百 国产成人免费在线 | 欧美激情一区二区三区 | 天天插日日操 | 人人干人人干人人 | 人人鲁人人莫人人爱精品 | 久久精品国内 | 日本网站免费观看 | 成人亚洲精品久久久久软件 | 狠狠干av | 久久综合一区 | 日韩精品一区二区三区视频播放 | 国产在线高清 | 欧美激情在线精品一区二区三区 | 怡红院怡春院一级毛片 | av毛片在线免费观看 | 操一草| 在线不卡视频 | 免费久久视频 | 二区在线视频 | 久久久久国产 | 亚洲综合视频 | 欧美国产日韩一区二区三区 | 精品久久网 | 理伦毛片 | 亚洲精品一二三 | 99视频免费 | 日韩精品1区2区3区 国产精品国产成人国产三级 | 亚洲网站在线播放 | 国产精品日产欧美久久久久 | 久久久久久久久久爱 | 国产一区2区 | 欧美成人精品二区三区99精品 | 在线欧美亚洲 | 成人av免费看 | 成人高清在线视频 | 国产精品美女久久久久久不卡 | av日韩一区| 自拍偷拍亚洲欧美 |