美文网首页
STM32CubeMX HAL库控制 W5500 - Part

STM32CubeMX HAL库控制 W5500 - Part

作者: T_K_233 | 来源:发表于2019-05-18 16:07 被阅读0次

http://narodstream.ru/stm-urok-91-lan-w5500-http-server-chast-1/

目录:

Inc
 |- httpd.h
 |- main.h
 |- net.h                                // 控制 LAN 接口
 |- stm32f1xx_hal_conf.h
 |- stm32f1xx_it.h
 |- w5500.h                              // 与微电路进行较低级别的通信
Src
 |- httpd.c
 |- main.c
 |- net.c
 |- stm32f1xx_hal_conf.c
 |- stm32f1xx_it.c
 |- w5500.c

main.c
在 CODE BEGIN 2 处添加初始化指令

...
  /* USER CODE BEGIN 2 */
  // 初始化寄存器
  net_ini();
  /* USER CODE END 2 */
...

net.h

/**
  ******************************************************************************
  * @file           : net.h
  * @brief          : Header for net.c file.
  *                   用于控制 LAN 接口
  ******************************************************************************
  *
  *
  ******************************************************************************
  */

#ifndef __NET_H
#define __NET_H
//--------------------------------------------------
#include "stm32f1xx_hal.h"
#include <string.h>
#include <stdlib.h>
#include <stdint.h>
#include "w5500.h"
//--------------------------------------------------
#define IP_ADDR {192,168,1,197}
#define IP_GATE {192,168,1,1}
#define IP_MASK {255,255,255,0}
#define LOCAL_PORT 80
//--------------------------------------------------
#define be16toword(a) ((((a)>>8)&0xff)|(((a)<<8)&0xff00))
//--------------------------------------------------
#endif /* __NET_H */

net.c

/**
  ******************************************************************************
  * @file           : net.c
  * @brief          : 用于控制 LAN 接口
  ******************************************************************************
  *
  *
  ******************************************************************************
  */

#include "net.h"
//-----------------------------------------------
extern UART_HandleTypeDef huart2;
//-----------------------------------------------
uint8_t ipaddr[4]=IP_ADDR;
uint8_t ipgate[4]=IP_GATE;
uint8_t ipmask[4]=IP_MASK;
uint16_t local_port = LOCAL_PORT;
char str1[60]={0};

//-----------------------------------------------
void net_ini(void) {
    w5500_ini();
}
void packet_receive(void) {
}

void net_poll(void) {
    packet_receive();
}
//-----------------------------------------------

w5500.h

/**
  ******************************************************************************
  * @file           : w5500.h
  * @brief          : Header for w5500.h file.
  *                   底层交互
  ******************************************************************************
  *
  *
  ******************************************************************************
  */
#ifndef W5500_H_
#define W5500_H_
//--------------------------------------------------
#include "stm32f1xx_hal.h"
#include <string.h>
#include <stdlib.h>
#include <stdint.h>
// #include "fatfs.h"
//--------------------------------------------------
#define CS_GPIO_PORT GPIOB
#define CS_PIN GPIO_PIN_6
#define SS_SELECT() HAL_GPIO_WritePin(CS_GPIO_PORT, CS_PIN, GPIO_PIN_RESET)
#define SS_DESELECT() HAL_GPIO_WritePin(CS_GPIO_PORT, CS_PIN, GPIO_PIN_SET)
//--------------------------------------------------
#define MAC_ADDR {0x00,0x15,0x42,0xBF,0xF0,0x51}
//--------------------------------------------------
#define BSB_COMMON 0x00
#define BSB_S0 0x01
#define BSB_S0_TX 0x02
#define BSB_S0_RX 0x03
//--------------------------------------------------
#define RWB_WRITE 1
#define RWB_READ 0
//--------------------------------------------------
#define OM_FDM0 0x00 // 可变长度数据传输模式
#define OM_FDM1 0x01 // 固定长度数据传输模式 一字节模式
#define OM_FDM2 0x02 // 固定长度数据传输模式 两字节模式
#define OM_FDM3 0x03 // 固定长度数据传输模式 四字节模式
//--------------------------------------------------
#define MR 0x0000//Mode Register
//--------------------------------------------------
// W5500 寄存器地址
#define SHAR0 0x0009 //Source Hardware Address Register MSB
#define SHAR1 0x000A
#define SHAR2 0x000B
#define SHAR3 0x000C
#define SHAR4 0x000D
#define SHAR5 0x000E // LSB
#define GWR0 0x0001  //Gateway IP Address Register MSB
#define GWR1 0x0002
#define GWR2 0x0003
#define GWR3 0x0004  // LSB
#define SUBR0 0x0005 //Subnet Mask Register MSB
#define SUBR1 0x0006
#define SUBR2 0x0007
#define SUBR3 0x0008 // LSB
#define SIPR0 0x000F //Source IP Address Register MSB
#define SIPR1 0x0010
#define SIPR2 0x0011
#define SIPR3 0x0012 // LSB
//--------------------------------------------------
#define Sn_PORT0 0x0004 // Socket 0 Source Port Register MSB
#define Sn_PORT1 0x0005 // Socket 0 Source Port Register LSB
//--------------------------------------------------
#define be16toword(a) ((((a)>>8)&0xff)|(((a)<<8)&0xff00))
//--------------------------------------------------
#endif /* W5500_H_ */

w5500.c

/**
  ******************************************************************************
  * @file           : w5500.c
  * @brief          : 底层交互
  ******************************************************************************
  *
  *
  ******************************************************************************
  */

#include "w5500.h"
//-----------------------------------------------
extern SPI_HandleTypeDef hspi1;
extern UART_HandleTypeDef huart2;
//-----------------------------------------------
extern char str1[60];
//-----------------------------------------------
uint8_t macaddr[6] = MAC_ADDR;
extern uint8_t ipaddr[4];
extern uint8_t ipgate[4];
extern uint8_t ipmask[4];
extern uint16_t local_port;
//-----------------------------------------------
static void Error (void) {
    HAL_UART_Transmit(&huart2, (uint8_t*)"Error!rn", 8, 0x1000);
}
//-----------------------------------------------
// 初始化 W5500 寄存器,将 读/写 清零
void w5500_ini(void) {
    uint8_t dtt = 0;
    uint8_t opcode = 0;

    // Hard Reset
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);
    HAL_Delay(70);
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);
    HAL_Delay(70);

    // Soft Reset
    opcode = (BSB_COMMON<<3)|OM_FDM1;
    w5500_writeReg(opcode, MR, 0x80);    // MR 模式传输 1 字节定长数据
    HAL_Delay(100);

    //Configute Net
    w5500_writeReg(opcode, SHAR0,macaddr[0]);
    w5500_writeReg(opcode, SHAR1,macaddr[1]);
    w5500_writeReg(opcode, SHAR2,macaddr[2]);
    w5500_writeReg(opcode, SHAR3,macaddr[3]);
    w5500_writeReg(opcode, SHAR4,macaddr[4]);
    w5500_writeReg(opcode, SHAR5,macaddr[5]);
    w5500_writeReg(opcode, GWR0,ipgate[0]);
    w5500_writeReg(opcode, GWR1,ipgate[1]);
    w5500_writeReg(opcode, GWR2,ipgate[2]);
    w5500_writeReg(opcode, GWR3,ipgate[3]);
    w5500_writeReg(opcode, SUBR0,ipmask[0]);
    w5500_writeReg(opcode, SUBR1,ipmask[1]);
    w5500_writeReg(opcode, SUBR2,ipmask[2]);
    w5500_writeReg(opcode, SUBR3,ipmask[3]);
    w5500_writeReg(opcode, SIPR0,ipaddr[0]);
    w5500_writeReg(opcode, SIPR1,ipaddr[1]);
    w5500_writeReg(opcode, SIPR2,ipaddr[2]);
    w5500_writeReg(opcode, SIPR3,ipaddr[3]);

    // 配置套接字 0
    opcode = (BSB_S0<<3)|OM_FDM1;
    w5500_writeReg(opcode, Sn_PORT0,local_port>>8);
    w5500_writeReg(opcode, Sn_PORT1,local_port);
}

// 将字节写入 W5500 的寄存器
void w5500_writeReg(uint8_t op, uint16_t addres, uint8_t data) {
    uint8_t buf[] = {addres >> 8, addres, op|(RWB_WRITE<<2), data};
    SS_SELECT();
    HAL_SPI_Transmit(&hspi1, buf, 4, 0xFFFFFFFF);
    SS_DESELECT();
}
//-----------------------------------------------

程序运行后可以通过路由器 ping 到 W5500 的地址 192.168.1.197

相关文章

网友评论

      本文标题:STM32CubeMX HAL库控制 W5500 - Part

      本文链接:https://www.haomeiwen.com/subject/cgstzqtx.html