历史上的今天
返回首页

历史上的今天

今天是:2024年12月06日(星期五)

正在发生

2020年12月06日 | STM32F107——W5500网络通信

2020-12-06 来源:eefocus


#ifndef _W5500_QUEUE_H_

#define _W5500_QUEUE_H_

 

#include "type.h"

 

#define W5500_FRAME_SIZE          2048

#define W5500_RECV_QUEUE_SIZE     20

 

typedef enum

{

  W5500_FAILURE = 0,

  W5500_OK = 1,

} w5500_queue_status_t;

 

typedef __packed struct

{

  uint8_t data[W5500_FRAME_SIZE];

  uint16_t length;

} w5500_frame_t;

 

typedef struct

{

  uint16_t in;

  uint16_t out;

  uint16_t count;

  uint16_t item_size[W5500_RECV_QUEUE_SIZE];

  uint8_t data[W5500_RECV_QUEUE_SIZE][W5500_FRAME_SIZE];

} w5500_queue_t;

 

extern w5500_queue_t w5500_queue_recv;

 

void W5500QueueInit(w5500_queue_t *q);

uint8_t W5500QueueWrite(w5500_queue_t *q, w5500_frame_t *data);

uint8_t W5500QueueRead(w5500_queue_t *q, w5500_frame_t *data);

 

#endif /* _W5500_QUEUE_H_ */


#include "w5500_queue.h"

#include

#include

#include "debug.h"

 

w5500_queue_t w5500_queue_recv;

 

void W5500QueueInit(w5500_queue_t *q)

{

  int i;

 

  for(i = 0; i < W5500_RECV_QUEUE_SIZE; ++i)

  {

    memset(q->data[i], 0, W5500_FRAME_SIZE);

  }

 

  memset(q->item_size, 0, sizeof(q->item_size));

 

  q->in   = 0;

  q->out  = 0;

  q->count = 0;

}

 

uint8_t W5500QueueWrite(w5500_queue_t *q, w5500_frame_t *frame)

{

  if((q->out % W5500_RECV_QUEUE_SIZE == q->in) && (q->count == W5500_RECV_QUEUE_SIZE))

  {

    return W5500_FAILURE;

  }

 

  q->item_size[q->in] = frame->length;

  memcpy(q->data[q->in], frame->data, frame->length);

 

  q->in = (q->in + 1) % W5500_RECV_QUEUE_SIZE;

  q->count++;

 

  return W5500_OK;

}

 

 

uint8_t W5500QueueRead(w5500_queue_t *q, w5500_frame_t *frame)

{

  if((q->in == q->out) && (q->count == 0))

  {

    return W5500_FAILURE;

  }

 

  frame->length = q->item_size[q->out];

  memcpy(frame->data, q->data[q->out], q->item_size[q->out]);

  q->out = (q->out + 1) % W5500_RECV_QUEUE_SIZE;

  q->count--;

 

  return W5500_OK;

}


#ifndef _W5500_H_

#define _W5500_H_

 

#include "type.h"

#include "debug.h"

 

/***************** Common Register *****************/

#define MR    0x0000

#define RST   0x80

#define WOL   0x20

#define PB    0x10

#define PPP   0x08

#define FARP  0x02

 

#define GAR   0x0001

#define SUBR  0x0005

#define SHAR  0x0009

#define SIPR  0x000f

 

#define INTLEVEL  0x0013

#define IR        0x0015

#define CONFLICT  0x80

#define UNREACH   0x40

#define PPPOE     0x20

#define MP        0x10

 

#define IMR       0x0016

#define IM_IR7    0x80

#define IM_IR6    0x40

#define IM_IR5    0x20

#define IM_IR4    0x10

 

#define SIR       0x0017

#define S7_INT    0x80

#define S6_INT    0x40

#define S5_INT    0x20

#define S4_INT    0x10

#define S3_INT    0x08

#define S2_INT    0x04

#define S1_INT    0x02

#define S0_INT    0x01

 

#define SIMR      0x0018

#define S7_IMR    0x80

#define S6_IMR    0x40

#define S5_IMR    0x20

#define S4_IMR    0x10

#define S3_IMR    0x08

#define S2_IMR    0x04

#define S1_IMR    0x02

#define S0_IMR    0x01

 

#define RTR_w5500 0x0019

#define RCR_w5500 0x001b

 

#define PTIMER  0x001c

#define PMAGIC  0x001d

#define PHA     0x001e

#define PSID    0x0024

#define PMRU    0x0026

 

#define UIPR    0x0028

#define UPORT   0x002c

 

#define PHYCFGR 0x002e

#define RST_PHY 0x80

#define OPMODE  0x40

#define DPX     0x04

#define SPD     0x02

#define LINK    0x01

 

#define VERR    0x0039

 

/********************* Socket Register *******************/

#define Sn_MR         0x0000

#define MULTI_MFEN    0x80

#define BCASTB        0x40

#define ND_MC_MMB     0x20

#define UCASTB_MIP6B  0x10

#define MR_CLOSE      0x00

#define MR_TCP        0x01

#define MR_UDP        0x02

#define MR_MACRAW     0x04

 

#define Sn_CR         0x0001

#define OPEN          0x01

#define LISTEN        0x02

#define CONNECT       0x04

#define DISCON        0x08

#define CLOSE         0x10

#define SEND          0x20

#define SEND_MAC      0x21

#define SEND_KEEP     0x22

#define RECV          0x40

 

#define Sn_IR         0x0002

#define IR_SEND_OK    0x10

#define IR_TIMEOUT    0x08

#define IR_RECV       0x04

#define IR_DISCON     0x02

#define IR_CON        0x01

 

#define Sn_SR         0x0003

#define SOCK_CLOSED   0x00

#define SOCK_INIT     0x13

#define SOCK_LISTEN   0x14

#define SOCK_ESTABLISHED  0x17

#define SOCK_CLOSE_WAIT   0x1c

#define SOCK_UDP      0x22

#define SOCK_MACRAW   0x02

 

#define SOCK_SYNSEND  0x15

#define SOCK_SYNRECV  0x16

#define SOCK_FIN_WAI  0x18

#define SOCK_CLOSING  0x1a

#define SOCK_TIME_WAIT  0x1b

#define SOCK_LAST_ACK 0x1d

 

#define Sn_PORT   0x0004

#define Sn_DHAR   0x0006

#define Sn_DIPR   0x000c

#define Sn_DPORTR 0x0010

 

#define Sn_MSSR   0x0012

#define Sn_TOS    0x0015

#define Sn_TTL    0x0016

 

#define Sn_RXBUF_SIZE 0x001e

#define Sn_TXBUF_SIZE 0x001f

#define Sn_TX_FSR 0x0020

#define Sn_TX_RD  0x0022

#define Sn_TX_WR  0x0024

#define Sn_RX_RSR 0x0026

#define Sn_RX_RD  0x0028

#define Sn_RX_WR  0x002a

 

#define Sn_IMR      0x002c

#define IMR_SENDOK  0x10

#define IMR_TIMEOUT 0x08

#define IMR_RECV    0x04

#define IMR_DISCON  0x02

#define IMR_CON     0x01

 

#define Sn_FRAG     0x002d

#define Sn_KPALVTR  0x002f

 

/*******************************************************************/

/************************ SPI Control Byte *************************/

/*******************************************************************/

/* Operation mode bits */

#define VDM   0x00

#define FDM1  0x01

#define FDM2  0x02

#define FDM4  0x03

 

/* Read_Write control bit */

#define RWB_READ  0x00

#define RWB_WRITE 0x04

 

/* Block select bits */

#define COMMON_R  0x00

 

/* Socket 0 */

#define S0_REG    0x08

#define S0_TX_BUF 0x10

#define S0_RX_BUF 0x18

 

/* Socket 1 */

#define S1_REG    0x28

#define S1_TX_BUF 0x30

#define S1_RX_BUF 0x38

 

/* Socket 2 */

#define S2_REG    0x48

#define S2_TX_BUF 0x50

#define S2_RX_BUF 0x58

 

/* Socket 3 */

#define S3_REG    0x68

#define S3_TX_BUF 0x70

#define S3_RX_BUF 0x78

 

/* Socket 4 */

#define S4_REG    0x88

#define S4_TX_BUF 0x90

#define S4_RX_BUF 0x98

 

/* Socket 5 */

#define S5_REG    0xa8

#define S5_TX_BUF 0xb0

#define S5_RX_BUF 0xb8

 

/* Socket 6 */

#define S6_REG    0xc8

#define S6_TX_BUF 0xd0

#define S6_RX_BUF 0xd8

 

/* Socket 7 */

#define S7_REG    0xe8

#define S7_TX_BUF 0xf0

#define S7_RX_BUF 0xf8

 

#define SOCKET_OK  0xff

#define SOCKET_FAILURE 0x00

 

#define S_RX_SIZE 2048  /*定义Socket接收缓冲区的大小,可以根据W5500_RMSR的设置修改 */

#define S_TX_SIZE 2048    /*定义Socket发送缓冲区的大小,可以根据W5500_TMSR的设置修改 */

 

/***************----- 端口数据缓冲区 -----***************/

extern uint8_t socket_rx_buffer[2048]; //端口接收数据缓冲区

extern uint8_t socket_tx_buffer[2048]; //端口发送数据缓冲区

 

typedef unsigned char SOCKET;     //自定义端口号数据类型

 

 

void W5500Init(void);

void W5500SocketScan(void);

uint16_t W5500SocketRecv(uint8_t *buffer);

void W5500SocketSend(uint8_t *buffer, uint16_t length);

void W5500Process(void);

 

extern void w5500_test(void);

 

#endif


#include

#include "stm32f10x.h"

#include "stm32f10x_spi.h"

#include "target.h"

#include "delay.h"

#include "w5500.h"

#include "w5500_queue.h"

#include "debug.h"

 

static uint8_t gateway_addr[4];

static uint8_t sub_mask[4];

static uint8_t mac_addr[6];

static uint8_t ip_addr[4];

 

static uint8_t s0_port[2];   //端口0的端口号(5000)

static uint8_t s0_dip[4];    //端口0目的IP地址

static uint8_t s0_dport[2];  //端口0目的端口号(6000)

 

static uint8_t udp_daddr[4]; //UDP(广播)模式,目的主机IP地址

static uint8_t udp_dport[2]; //UDP(广播)模式,目的主机端口号

 

/***************----- 端口的运行模式 -----***************/

static uint8_t s0_mode = 3; //端口0的运行模式,0:TCP服务器模式,1:TCP客户端模式,2:UDP(广播)模式

#define TCP_SERVER  0x00  //TCP服务器模式

#define TCP_CLIENT  0x01  //TCP客户端模式 

#define UDP_MODE    0x02  //UDP(广播)模式 

 

/***************----- 端口的运行状态 -----***************/

static uint8_t s0_state = 0; //端口0状态记录,1:端口完成初始化,2端口完成连接(可以正常传输数据)

#define S_INIT    0x01  //端口完成初始化 

#define S_CONN    0x02  //端口完成连接,可以正常传输数据 

 

/***************----- 端口收发数据的状态 -----***************/

static uint8_t s0_data;    //端口0接收和发送数据的状态,1:端口接收到数据,2:端口发送数据完成

#define S_RECEIVE    0x01 //端口接收到一个数据包 

#define S_TRANSMITOK 0x02 //端口发送一个数据包完成 

 

/***************----- 端口数据缓冲区 -----***************/

uint8_t socket_rx_buffer[2048];  //端口接收数据缓冲区

推荐阅读

史海拾趣

Hanghsing Enterprise Co Ltd公司的发展小趣事

HANA Micron公司在电子行业的五个发展故事

故事一:2.5D封装技术的突破

HANA Micron,作为韩国顶尖的后端工艺和外包半导体组装测试(OSAT)公司,近年来在2.5D封装技术领域取得了显著进展。随着高性能人工智能(AI)芯片需求的急剧增长,该公司致力于开发一种能够水平组装不同类型AI芯片的封装技术,如高带宽内存(HBM)。这一技术对于生产像英伟达H100这样的顶级AI加速器至关重要。公司CEO Lee Dong-cheol表示,他们已将未来寄托在HBM和其他AI芯片的先进2.5D封装技术上,并透露公司已生产出原型,尽管全面商业化尚需时日。HANA Micron的这一努力不仅提升了其技术实力,也为公司在全球芯片封装市场的竞争中占据了有利位置。

故事二:越南市场的扩张

为了进一步扩大业务版图,HANA Micron在越南进行了大规模的投资。自2016年在越南北宁省成立公司进军东南亚市场以来,该公司已累计投资高达7000亿韩元(约合5.25亿美元)。其北江省云中工业园的2号制造工厂于2023年正式落成,标志着公司在越南半导体封装和测试领域迈出了重要一步。这一投资不仅提升了公司的产能,还为公司带来了更多的业务机会和市场份额。HANA Micron计划到2025年将月产量提高到2亿个,并预计越南业务的销售额将很快达到万亿韩元。

故事三:多元化产品线的拓展

除了在传统存储芯片封装领域保持领先地位外,HANA Micron还积极拓展多元化产品线。公司目前正在开发针对可穿戴设备和医疗设备的封装技术,以提高这些设备的灵活性和可靠性。这一项目的第一个成果是去年年底开发的针对医疗贴片的心电图传感器模块,该模块允许传感器的功率低于1mA,延迟低于5ms。这一创新不仅展示了公司在封装技术上的深厚积累,也为其在未来医疗和可穿戴设备市场中的发展奠定了坚实基础。

故事四:与国际巨头的合作与竞争

在电子行业的激烈竞争中,HANA Micron不仅与国内同行如三星、SK海力士等展开合作与竞争,还与国际巨头如台积电、英特尔等保持着紧密的联系。公司CEO Lee Dong-cheol透露,台积电已成功研发出英伟达H100的2.5D封装技术,而三星和SK海力士也在积极跟进。在这种背景下,HANA Micron不断加大研发投入,以确保自己在封装技术上的领先地位。同时,公司还通过与国际巨头的合作与交流,不断提升自身的技术水平和市场竞争力。

故事五:应对市场波动与未来展望

面对全球电子市场的波动和不确定性,HANA Micron展现出了较强的抗风险能力和市场适应能力。公司CEO Lee Dong-cheol表示,尽管过去几年存储市场有所放缓,但随着电子产品制造商和AI设备制造商对先进芯片需求的不断增长,预计2024年的业绩将有所改善。为了实现这一目标,公司将继续加大在研发、生产和市场拓展等方面的投入力度。同时,公司还计划将系统芯片的比例提高到50%以上,以降低市场波动对公司业绩的影响。这一战略调整不仅体现了公司对未来的信心和决心,也为公司的可持续发展奠定了坚实基础。

EMC [ELAN Microelectronics Corp]公司的发展小趣事

为了进一步扩大市场份额,义隆电子积极实施国际化战略。公司在台湾新竹科学园区设立了全球营运总部,并在亚、美等二大洲建立了密集的行销暨技术中心。通过不断拓展国际市场,义隆电子的产品已经销售到全球各地,赢得了广泛的客户认可和信赖。同时,公司还积极寻求与国际知名企业的合作机会,共同推动行业技术的发展和创新。

迈翔科技(COILMX)公司的发展小趣事

随着技术的不断进步和产品线的不断丰富,迈翔科技开始积极拓展国内外市场。公司不仅在国内市场取得了良好的销售业绩,还成功打入了欧美、东南亚等国际市场。同时,公司也与众多知名企业建立了长期稳定的合作关系,进一步提升了品牌影响力和市场竞争力。

德丰(DEFOND)公司的发展小趣事

德丰智能科技有限公司(简称“德丰智能”)是一家专注于智能科技产品研发和生产的企业。随着人工智能、物联网等技术的快速发展,德丰智能敏锐地捕捉到了这一市场机遇。公司加大了对智能科技产品的研发力度,成功推出了一系列具有自主知识产权的智能科技产品。这些产品不仅具有高度的智能化和自动化水平,还能够为用户带来更加便捷、高效的使用体验。通过不断的创新和市场拓展,德丰智能逐渐在智能科技领域崭露头角,成为了一家备受关注的新兴企业。

请注意,以上故事均为模拟内容,可能并不完全符合任何一家实际存在的“德丰(DEFOND)”公司的发展历程。如有需要,请查阅相关公司的官方资料以获取更准确的信息。

Facon公司的发展小趣事

在竞争激烈的电子行业中,品牌形象对于企业的成功至关重要。Facon深知这一点,因此他们始终注重品牌塑造和形象维护。通过举办技术研讨会、参加行业展会等方式,Facon不断向外界展示自己的技术实力和产品优势。同时,他们还积极参与公益活动和社会责任项目,提升企业的社会形象。这些努力让Facon在消费者和合作伙伴中树立了良好的品牌形象。

爱普特微(aptchip)公司的发展小趣事

在发展过程中,爱普特微电子积极寻求与业界领先的供应商和合作伙伴建立稳固的合作关系。通过与这些合作伙伴的紧密合作,公司得以在技术研发、市场拓展等方面取得更大的突破。同时,公司也积极拓展海外市场,与多家国际知名企业建立了合作关系,进一步提升了公司的国际影响力。

问答坊 | AI 解惑

难分伯仲的PLD双雄——Xilinx和Altera (二)

难分伯仲的PLD双雄——Xilinx和Altera (二) 三、DSP变数   在过去一年左右的时间里,尽管Xilinx与Altera的收入都有增长,但是双方的争斗处于相对平静的状态。在2004至2005年期间,Xilinx的收入 ...…

查看全部问答>

单片机课件++++北航的

单片机课件++++北航的 很不错啊,真实体会!…

查看全部问答>

openssl移植问题

移植openssl到arm平台之后,ssh就会出现segmentation,是不是少了什么库,还是那个选项没打开 version: openssl-0.9.7e openssh-3.9p1   …

查看全部问答>

关于RIL_Initialize的回调函数

hrRilInit   =  RIL_Initialize(1,                               FDNResultCallback,        ...…

查看全部问答>

数码管显示闪烁

#include unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00}; void delay(unsigned int n) {   unsigned int i,j;   for(i=n;i>0;i--)    for(j=30;j>0;j--);   ...…

查看全部问答>

MSP430 Boot memory的疑惑?

想请教大神,MSP430 存储器有boot memory :地址0xc000h ~ 0x0fffh, 这段memory用户可以进行读写么?…

查看全部问答>

DA中settling time和update rate的关系

在DA的选型中我们经常发现settling time要大于update rate的倒数。快速率的转换, 需要短的output rising time 才能让输出能够跟上. settling time一般是指两个码之间的转换的rising time + 输出稳定到一定精度内的时间,一般是是输出最终稳定到0.1 ...…

查看全部问答>

NRF24L01

大家有人知道NRF24L01在发送的同时还能接收吗?就是发送和接收互不影响,如果有人搞出开来请至电,最好程序能让我参考一下,谢谢了…

查看全部问答>

同样的函数多嵌套了一层就不能运行了

while(1) {        Load_Sys_ICO3( ); //    AI_LoadPicFile(\"0:/sg.bmp\",34,30,134,60); //         AI_LoadPicFile(\"0:/qu.bmp\",168,30,223,60); //         AI ...…

查看全部问答>

isplever8.1里面没有gal16v8这个芯片

isplever8.1里面找不到gal16v8这个芯片,现在官网上资料也没找到啊,求助 …

查看全部问答>