STM32CubeMX HAL库控制 W5500 - Part
2019-05-18 本文已影响0人
T_K_233
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