月度归档:2019年03月

LPC1768读写W25Q128程序

uint8_t W25QXX_Buf[4096];

GPIO设置

/*SPI pin set*/

PinCfg.Funcnum = PINSEL_FUNC_3;

PinCfg.Portnum = 0;

PinCfg.Pinmode = PINSEL_PINMODE_TRISTATE;

PinCfg.Pinnum = SPI_SCK;

PINSEL_ConfigPin(&PinCfg);

PinCfg.Pinnum = SPI_MOSI;

PINSEL_ConfigPin(&PinCfg);

PinCfg.Pinnum = SPI_MISO;

PINSEL_ConfigPin(&PinCfg);

PinCfg.Funcnum = PINSEL_FUNC_0;

PinCfg.Portnum = 0;

PinCfg.OpenDrain = PINSEL_PINMODE_NORMAL;

PinCfg.Pinnum = SPI_CS;

PINSEL_ConfigPin(&PinCfg);

GPIO_SetDir(0, (1<<SPI_CS), 1);

GPIO_SetValue(0, (1<<SPI_CS));

void Spi_Initial(void)

{

SPI_CFG_Type spi0;

spi0.CPHA = SPI_CPHA_FIRST;

spi0.CPOL = SPI_CPOL_LO;

spi0.ClockRate = 3125000; //spi_clk = 25000000,25000000/8=3125000,能使用的最高频率

spi0.DataOrder = SPI_DATA_MSB_FIRST;

spi0.Databit = SPI_DATABIT_8;

spi0.Mode = SPI_MASTER_MODE;

SPI_Init(LPC_SPI,&spi0);

}

uint8_t SPIF_POLLING(void)

{

uint8_t n = 0xff;

while (n–)

{

if (LPC_SPI->SPSR & 0x80)

return TRUE;

}

return FALSE;

}

继续阅读

TCP相关知识

1、 三次握手过程最后一个数据包丢失

当Client端收到Server的SYN+ACK应答后,其状态变为ESTABLISHED,并发送ACK包给Server,如果此时ACK在网络中丢失,那么Server端该TCP连接的状态为SYN_RECV,并且依次等待3秒,6秒,12秒后重新发送SYN+ACK包,以便Client重新发送ACK包。

如果重发指定次数后,仍然未收到ACK应答,那么一段时间后,Server自动关闭这个连接。但是Client认为这个连接已经建立,如果Client端向Server端写数据,Server端将以RST包响应,Client端方能感知到Server端的错误,从而断开连接。

2、 TCP状态变迁

客户端:CLOSED-SYN_SENT_ESTABLISED-FIN_WAIT_1-FIN_WAIT_2-TIME_WAIT-CLOSED

服务器端:CLOSED-LISTEN-SYN_RCVD-ESTABLISED-CLOSE_WAIT-LAST_ACK-CLOSED

3、 TCP协议RST标志

发送RST包关闭连接时,不必等待缓冲区的包都发出去,直接丢弃缓冲区的包,发送RST包。

接收端收到RST包后,也不必发送ACK包来确认。

四次握手不是关闭TCP连接的唯一方法,有时,如果主机需要尽快关闭连接(或连接超时,端口或主机不可达),RST包将被发送,由于RST包不是TCP连接中的必须部分,可以只发送RST包(即不带ACK标记),但在正常的TCP连接中RST包可以带ACK确认标记,RST包是可以不要收到对方确认的。

处于LISTEN状态的控制块只能响应SYN握手包,对非SYN握手包返回一个RST报文。

以太网帧结构

帧结构图:

clip_image002

前同步码和帧开始定界符:一个帧以7个字节的前导码和1个字节的帧开始符作为帧的开始。在线路上帧的这部分的位模式是10101010 10101010 10101010 10101010 10101010 10101010 10101010 10101011。

MAC 目的地址:第三个字段是6字节(MAC地址占48位,如:FF,FF,FF,FF,FF),发送方的网卡(MAC)地址,用处是当网卡接收到一个数据帧时,首先会检查该帧的目的地址,是否与当前适配器的物理地址相同,如果相同则会进一步处理,不同则直接丢弃。

源MAC地址:发送端的MAC地址同样占6个字节。

类型:该字段在网络协议栈分解中及其重要,考虑当PDU(协议数据单元)来到某一层时,它需要将PDU交付给上层,而上层协议众多,所以在处理数据的时候,必须要一个字段标识我这个交付给谁。如,该字段为0x0800时,表示将有效载荷交付给IP协议,为0x0806交付给ARP,0X8035交付给RARP。

数据:数据也叫有效载荷,除过当前层协议需要使用的字段外,即需要交付给上层的数据,以太网帧数据长度规定最小为46字节,最大为1500字节,如果有不到46字节时,会用填充字节填充到最小长度。最大值也叫最大传输单元(MTU)。

帧检验序列FCS(使用CRC校验法):检测该帧是否出现差错。抓包时无法看到4字节校验值。

以太网规定以太网帧数据域部分最小为64字节(6字节目的MAC地址+6字节源MAC地址+2字节协议类型+最小46字节数据+4字节CRC校验),CRC校验抓包时无法看到。数据字段长度小于46字节时,MAC子层会在数据字段的后面填充以满足数据帧长度不小于64字节。由于填充数据由MAC子层负责,不同的抓包软件抓到的数据帧大小可能不同,比如一个TCP的ACK确认帧,有的抓包软件显示是54字节,有的显示是60字节。显示60字节的后面有填充数据段。