提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

IIC协议详解

  • 前言
  • 一、IIC协议简介
    • 1.1 简介
    • 1.2 IIC物理层
    • 1.3 协议层
      • 1.3.1 IIC基本读写过程
    • 1.3.2 通信的起始和停止信号
    • 1.3.3 数据有效性
    • 1.3.4 地址及数据方向
    • 1.3.5 响应
  • 二、IIC特性
    • 2.1 软件模拟协议
      • 2.1.1 引言
      • 2.1.2 IIC初始化函数
      • 2.1.3 起始信号
      • 2.1.4 等待应答信号
      • 2.1.5 应答信号
      • 2.1.6 停止信号
      • 2.1.7 IIC发送字节
      • 2.1.8 IIC读取字节
    • 2.2 硬件协议
      • 2.2.1 IIC初始化函数
  • 三、IIC实验
    • 3.1 OLED实验
    • 3.2 逻辑分析仪
    • 3.3 IIC实验【改编自正点原子实验】
      • 3.3.1 实验介绍
      • 3.3.2 逻辑分析仪结果
      • 3.3.3 示波器结果
  • 总结

前言

STM32常用协议系列文章



一、IIC协议简介

1.1 简介

IIC(Inter - Intergrated Circuit)总线是由Philips公司开发,工作方式是半双工、同步、串行传输。虽结构简单【两条双向信号线SDA和SCL】,但其传输距离较短,传输速率较低一般为几百kbps左右。主要用于低速场合、小数据量场合。因计算机科学中,大部分复杂问题可以通过分层的思想进行简化。这里也以分层的方式来理解,对待协议最基本的分层方式是将其分为物理层和协议层。其中,物理层规定通信中具有机械、电子功能特性,确保原始数据在物理媒体中的传输。协议层主要规定通信逻辑,统一收发双方的数据打包、解包标准。套用火哥的话来说就是:“物理层规定是用嘴巴还是肢体来交流,而协议层是规定我们是用英文还是中文来交流。”

1.2 IIC物理层


上图是通信设备常见连接方式,具有如下特点:

  1. 一个支持设备的总线【总线:指多个设备共用的信号线】。在一个IIC通信总线中,可连接多个IIC通信设备,支持多个通信主机和多个通信从机。
  2. 一个IIC总线有且只有两条总线【SCL总线和SDA总线】,SCL总线:串行时钟总线,用于同步数据收发;SDA总线:双向串行数据线,用于表示数据。
  3. 连接到总线上的设备都有一个独立的地址,因此,主机通过寻址的方式对不同设备进行访问;
  4. 总线通过上拉电阻连接到电源。当IIC设备空闲时,会输出**高阻态**,而当所有设备都空闲,都输出高阻态时,上拉电阻把总线拉成高电平。而当连接到总线上的任一器件输出低电平时,都将使总线的信号变低,可知各器件SDA及SCL都是线“与”关系。
  5. 多个主机同时使用总线时,为了防止数据冲突,会利用仲裁方式决定由哪个设备占用总线。
  6. 具有3种传输模式:标准【100kbps】、快速【400kbps】和高速【3.4Mbps】(目前大多设备并不支持该高速模式)。
  7. 连接到相同总线的IC数量受到总线的最大电容400pF限制。

备注:第5点和第7点,个人目前不是很理解其机理。

1.3 协议层

1.3.1 IIC基本读写过程

主机写数据到从机中

  • step 01:由主机的IIC接口产生并传输起始信号(S)到总线上,此时连接到总线上的所有从机都会接到这个信号。【备注:同一时刻只能有一个主机】
  • step02:起始信号产生后,所有从机就开始等待主机紧接下来广播的从机地址信号【该地址可以是7位也可以是10位】,当主机广播的地址与某个设备地址相同时,这个设备就被选中了,而没被选中的设备将会忽略之后的数据信号;在选择完从机地址位后,需要选择传输方向,这里是写数据,所以该位置‘0’。
  • step03:从机在接收到匹配地址后,会返回一个ACK信号或NACK信号给主机。
  • step04:主机在接受到ACK信号之后,便可以发送数据了【每次只能发送一个字节】。
  • step05:等待从机接收后,发送应答ACK信号给主机。
  • …N个数据【N没有限制】…
  • stepn:从机返回NACK信号时,主机向从机发送停止信号; 或主机发送数据后,不用管从机,直接向从机发送停止信号。

主机读数据到从机中
与主机写数据到从机中的步骤大致相同,差异如下:

  • 第一点:传输方向,读数据【传输位应该置’1’】
  • 第二点:当主机希望停止接收数据时,需要向主机返回一个非应答NACK信号,则主机会发送停止信号给从机。但从机在未得到主机的NACK信号时,却无法发送停止信号【不具有发送停止信号的权利】。

主机读和写数据【IIC复合格式】
与前两者的差异较大,差异如下:

  • 该传输过程有两次起始信号(S)。一般在第一次传输中,主机通过SLAVE ADDRESS寻找到从设备后,发送一段“数据”【这段数据通常是从设备内部的寄存器或寄存器地址】;在第二次传输中,才会对该地址的内容进行读或写。也就是说:第1次通信是告诉从机读写地址,第2次则是读写的实际内容【后续会有实验进行说明】。

1.3.2 通信的起始和停止信号

  • 起始和停止信号一般由主机发送
  • 起始信号:SCL为高电平信号时,SDA由高电平切换为低电平,表示通信的开始;
  • 停止信号:SCL为高电平信号时,SDA由低电平切换为高电平,表示通信的结束;

1.3.3 数据有效性

IIC使用SDA信号线来传输数据,使用SCL信号线进行数据同步。SDA数据线在SCL的每个时钟周期传输一位数据,如上图所示。传输时,SCL为高电平的时候,SDA表示的数据有效,即此时的SDA为高电平则表示数据为“1”,反之则为“0” 。而当SCL为低电平的时候,SDA表示的数据无效,一般这个时候SDA进行数据切换,为下一个要表示的数据做好准备。至于为什么要在这个时候切换,联想之前的开始和停止信号。

1.3.4 地址及数据方向

  • IIC总线上的每个设备都有自己的独立地址;
  • SLAVE ADDRESS可以是7位或10位,通常情况下7位使用更为频繁;
  • 数据传输方向位:1表示读 / 0表示写
  • 读数据方向时,主机释放SDA总线由从机控制SDA总线,主机接受信号; 写数据方向时,SDA由主机控制,从机接收信号

1.3.5 响应

IIC的数据和地址传输都带有响应【ACK和NACK两种信号】,作为数据接收端时,当设备(无论住从机)接收到IIC传输的一个字节数据或地址后:

  • 若希望对方继续发送,则需要向对方发送“应答ACK”信号,发送方会继续发送下一个数据;
  • 若希望结束数据传输,则需要向对方发送“非应答NACK”信号,发送方接收到该信号后会产生一个停止信号,结束信号传输。

二、IIC特性

NOTE: 本节主要引自于大佬 果果小师弟 的文章

2.1 软件模拟协议

2.1.1 引言

若我们直接控制STM32的两个GPIO引脚,分别用作SCL和SDA,按照上述信号的时序要求,直接像控制LED那样控制引脚的输出(若是接收数据时,则读取SDA电平),就可以实现IIC通信。对于USART同样,也能实现USART通信。所以只要遵守协议,就是标准的通信,不管如何实现它,不管是ST生产的控制器函数ATMEL生产的存储器,都能按通信标准交互。这种直接控制GPIO引脚电平产生通信时序时,由CPU控制每个时刻的引脚状态,称之为“软件模拟协议”方式。

2.1.2 IIC初始化函数

功能:配置IIC的时钟线和数据线

void IIC_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOC, &GPIO_InitStructure); IIC_SCL=1;IIC_SDA=1;
}

因为是软件模拟IIC,那么我们选择IIC通讯的引脚就相对来说比较随意,具体使用根据《STM32参考手册》进行查询。这里,选择PB6、PB7作为IIC的数据和时钟引脚。设置为推挽输出即可。

2.1.3 起始信号

功能:CPU发起IIC总线启动信号

void IIC_Start(void)
{IIC_SDA=1;        IIC_SCL=1;delay_us(4);IIC_SDA=0;//START:当 CLK 为高电平时,DATA 从高到低改变delay_us(4);    IIC_SCL=0;//钳住I2C总线,准备发送或接收数据 delay_us(4);
}

起始信号产生后,所有从机设备就开始等待STM32紧接下来的从机地址信号。在IIC总线上,每个设备的地址都是唯一的,当主机广播的地址与某个设备地址相同时,这个设备就被选中了,没被选中的设备将会忽略之后的数据信号。根据IIC协议,从机地址可以是 7位或10位。在地址位之后,是传输方向的选择位,该位为 0时,表示后面的数据传输方向是由主机传输至从机,即主机向从机写数据。该位为 1时,则相反,即主机由从机读数据。

2.1.4 等待应答信号

功能:CPU产生一个时钟,并读取器件的ACK应答信号

//返回值:1,接收应答失败  0,接收应答成功
u8 IIC_Wait_Ack(void)
{u8 re;IIC_SDA=1;delay_us(1);//CPU释放SDA总线     IIC_SCL=1;delay_us(1);//CPU驱动SCL=1,此时器件会返回ACK应答if(READ_SDA){//CPU读取SDA口线状态re=1;}else{re=0;}   IIC_SCL=0;//时钟输出0      return re;
}

该函数用于 STM32 作为发送方时,等待及处理接收方传来的响应或非响应信号, 即一般调用前面的 IIC_SendByte 函数后,再调用本函数检测响应。
  STM32控制 SDA 信号线输出高阻态,释放它对 SDA的控制权,由接收方控制;控制 SCL 信号线切换高低电平,产生一个时钟信号,根据IIC协议,此时接收方若把 SDA 设置为低电平,就表示返回一个“应答”信号,若 SDA 保持为高电平,则表示返回一个“非应答 ”信号;在 SCL 切换高低电平之间,有个延时确保给予了足够的时间让接收方返回应答信号,延时后使用宏READ_SDA读取 SDA 线的电平,根据电平值赋予 re 变量的值;函数的最后返回 re的值,接收到响应时返回 0,未接收到响应时返回 1。当 STM32 作为数据接收端,调用 IIC_ReadByte函数后,需要给发送端返回应答或非应答信号,此时可使用 IIC_Ack及 IIC_Nack 函数处理,该处理与 IIC_Wait_Ack函数相反,此时 SDA线也由 STM32控制。

2.1.5 应答信号

功能:CPU产生一个ACK信号

//CPU产生一个ACK信号
void IIC_Ack(void)
{IIC_SDA=0;//CPU驱动SDA=0delay_us(2);IIC_SCL=1;//CPU产生一个时钟delay_us(2);IIC_SCL=0;delay_us(2);IIC_SDA=1;//CPU释放SDA总线【高阻态】
}
//CPU产生1个NACK信号
void IIC_Nack (void)
{IIC_SDA=1();//CPU驱动SDA=1delay_us(2);IIC_SCL=1;//CPU产生1个时钟delay_us(2);IIC_SCL=0;delay_us(2);
}

IIC的数据和地址传输都带响应。响应包括“应答(ACK)”和“非应答(NACK)”两种信号。作为数据接收端时,当设备接收到 IIC 传输的一个字节数据或地址后,若希望对方继续发送数据,则需要向对方发送“应答(ACK)”信号,发送方会继续发送下一个数据;若接收端希望结束数据传输,则向对方发送“非应答(NACK)”信号,发送方接收到该信号后会产生一个停止信号,结束信号传输。
  代码的具体流程就是:根据要返回“应答”还是“非应答”信号,先准备好 SDA 线的电平,IIC_Ack函数中把 SDA 线设置为低电平,表示“应答”信号,IIC_Nack 函数中把 SDA 线设置为高电平,表示“非应答”信号;控制 SCL 线进行高低电平切换,产生一个时钟信号,在 SCL 线的高低电平之间加入一个延时,确保有足够的时间让通讯的另一方接收到 SDA信号线的电平;在 IIC_Ack 函数的末尾,响应信号发送结束后,重新把 SDA 线设置为高电平以释放总线的控制权,方便后续的通讯。

2.1.6 停止信号

功能:CPU发起IIC总线停止信号

{    IIC_SDA=0;//STOP:当 CLK 为高电平时候, SDA出现一个上调表示IIC总线停止信号IIC_SCL=1;delay_us(4);IIC_SDA=1;//发送IIC总线结束信号
}

停止信号直接看是时序图就可以搞定了,在SCL和SDA都为低电平的情况下,首先把时钟线SCL拉高,再把数据线SDA拉高,IIC就会结束传输了。
  以上就是软件模拟IIC协议了,在平时的应用中我们实际上不需要掌握这些具体的代码,只要知道IIC协议的过程原理就行了,因为一般来说我们用的都是别人写好的代码,我们只需要会用就可以了,如果你的代码和我这些有出入也没有关系,只要能正常通讯即可,当然如果你的设计在过程中出现了一些问题,或者显示不正常,我们首先考虑的也不是底层协议的问题,而是你代码的其他问题。

2.1.7 IIC发送字节

功能:CPU向IIC总线设备发送8bit数据

void IIC_SendByte(u8 Byte)
{u8 i;/* 先发送字节的高位bit7 */for (i = 0; i < 8; i++){       if (Byte & 0x80){IIC_SDA=1;}else{IIC_SDA=0;}delay_us(2);IIC_SCL=1;delay_us(2);IIC_SCL=0;if (i == 7){IIC_SDA=1;// 释放总线}Byte <<= 1; //左移一个bitdelay_us(2);}
}

该函数以其输入参数作为要使用IIC协议输出的数据,该数据大小为一字节。函数的主体是一个8次的 for 循环,循环体执行一次将会对外发送一个数据位,循环结束时刚好发送完该字节数据。步骤分解如下:
  首先程序对输入参数Byte和 0x80“与”运算,判断其最高位的逻辑值,为 1 时控制 SDA输出高电平,为 0则控制 SDA输出低电平;接下来延时,以此保证 SDA 线输出的电平已稳定,再进行后续操作;之后控制 SCL线产生高低电平跳变,也就是产生 IIC协议中 SCL线的通讯时钟;在 SCL线高低电平之间有个延时,该延时期间 SCL线维持高电平,根据 IIC协议,此时数据有效,通讯的另一方会在此时读取 SDA 线的电平逻辑,高电平时接收到该位为数据 1,否则为 0;就这样一次循环体执行结束,Byte 左移一位以便下次循环发送下一位的数据;如次循环 8 次,把Byte 中的 8 位个数据位发送完毕,在最后一位发送完成后(此时循环计数器 i=7),控制 SDA 线输出 1(即高阻态),也就是说发送方释放 SDA总线,等待接收方的应答信号。

2.1.8 IIC读取字节

功能:CPU从IIC总线设备读取8bit数据

u8_t IIC_ReadByte(void)
{u8 i;u8 value;//读到第1个bit为数据的bit7value = 0;for (i = 0; i < 8; i++){IIC_SCL=1;delay_us(2);if (SDA_READ){value++;}IIC_SCL=0;delay_us(2);value <<= 1;}return value;
}

IIC_ReadByte 函数也是以 for 循环为主体,循环体会被执行 8次,执行完毕后将会接收到一个字节的数据,循环体接收数据的流程如下:
  首先使用一个变量 value 暂存要接收的数据,每次循环结束后先对 value 的值左移 1 位,以给 value 变量的 bit0 腾出空间,bit0 将用于缓存最新接收到的数据位,一位一位地接收并移位,最后拼出完整的 8位数据;然后控制 SCL线进行高低电平切换,输出 IIC 协议通讯用的时钟;在SCL线高低电平切换之间,有个延时,该延时确保给予了足够的时间让数据发送方进行处理,即发送方在 SCL 时钟驱动下通过 SDA 信号线发出电平逻辑信号,而这个延时之后,作为数据接收端的 STM32 使用宏SDA_READ读取 SDA信号线的电平,若信号线为 1,则 value++,即把它的 bit0置 1,否则不操作(这样该位将保持为 0),这样就读取到了一位的数据;接下来SCL线切换成低电平后,加入延时,以便接收端根据需要切换 SDA 线输出数据;直到循环结束后,value 变量中包含有 1 个字节数据,使用 return 把它作为函数返回值返回。

2.2 硬件协议

相对来说,硬件IIC直接使用外设来控制引脚,可以减轻CPU的负担。不过使用硬件IIC时必须使用某些固定的引脚作为SCL和SDA,软件模拟IIC则可以使用任意GPIO引脚,相对比较灵活。STM32的IIC外设可用作通讯的主机或从机,支持 100Kbit/s 和 400Kbit/s 的速率,支持 7位、10位设备地址,支持 DMA数据传输,并具有数据校验功能。它的IIC外设还支持 SMBus2.0协,SMBus 协议与IIC类似,主要应用于笔记本电脑的电池管理中。STM32 芯片有多个IIC外设,它们的IIC通讯信号引出到不同的 GPIO 引脚上,使用时必须配置到这些指定的引脚,GPIO引脚的复用功能,可查阅《STM32F1xx 规格书》,以它为准。

2.2.1 IIC初始化函数

void IIC_init(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;// 开漏输出 GPIO_Init(GPIOA, &GPIO_InitStructure);  IIC_SCL=1;IIC_SDA=1;//给一个停止信号, 复位I2C总线上的所有设备到待机模式
}

因为是硬件IIC直接使用外设来控制引脚,那么我们选择IIC通讯的引脚就比较固定,具体使用的引脚可查阅《STM32F1xx 规格书》,以它为准。可以看到PB6和PB7两个引脚可以作为IIC的通讯引脚,而且PB6为SCL时钟线,而PB7则为SDA数据线,并设置为开漏输出。
  这里为啥设置为开漏输出的方式呢?
  这是由于使用的是软件模拟IIC方式,而IIC协议的 GPIO 必须的开漏输出模式,开漏输出模式在输出高电平时实际输出高阻态,当IIC该总线上所有设备都输出高阻态时,由外部的上拉电阻上拉为高电平。另外当 STM32 的 GPIO 配置成开漏输出模式时,它仍然可以通过读取GPIO 的输入数据寄存器获取外部对引脚的输入电平,也就是说它同时具有浮空输入模式的功能,因此在后面控制 SDA线对外输出电平或读取 SDA线的电平信号时不需要切换 GPIO的模式。
  另外在硬件IIC协议之下,它的起始信号、等待应答信号、应答信号、停止信号都与软件模拟IIC协议之下的函数相同,在这里我就不重复说明了。


三、IIC实验

3.1 OLED实验

实验描述:通过MCU向0.96寸OLED屏写入16*16的字符‘A’
实验图片:
实验相关材料:

  • 16X16的字符A的取模: {0x00,0x00,0xC0,0x38,0xE0,0x00,0x00,0x00,0x20,0x3C,0x23,0x02,0x02,0x27,0x38,0x20},/“A”,33/
  • 中景园0.96寸OLED屏的SLAVE ADDRESS: 0X3C

3.2 逻辑分析仪

NOTE:由于IIC的传输速率在几百Kbps左右,所以采样率按照10倍左右进行采样,这里,我现在6M左右的采样率。

逻辑分析仪结果展示:

由上图,可以清楚地从逻辑分析仪采样的数据中,发现MCU正在向SLAVE ADDRESS【0x3c】位置写入数据,下图是对采样的数据进行分析的结果。


由上图可知,字符’A’分两次,从MCU传送到OLED屏中,这是为什么呢?这里,就要提及它涉及到的OLED_ShowChar函数了。

由于这里size1取16,所以根据计算size2为16,需要进行十六次循环。在标注的多字节处理中,可知将字符分为上下两部分进行处理。所以,这里逻辑分析仪抓取的数据是分为两次进行传输的,与程序一致。


3.3 IIC实验【改编自正点原子实验】

3.3.1 实验介绍

因OLED实验的模拟IIC通过逻辑分析仪解析出来后,不方便观看,故特加入IIC实验【改编于正点原子第二十八章的IIC实验】。只需要修改mian.c文件中的这几处代码,若没有LCD屏幕,只需要注释掉这部分的代码不影响整个实验。

3.3.2 逻辑分析仪结果

3.3.3 示波器结果


备注:这里 00001010 即代码修改处设置的内存地址:10,若不懂请参照本文1.3.1IIC复合通信格式


总结

  • 有些部分理解还不到位,但对IIC协议已有一个大概的理解,细微之处,后续使用时,再补充完善;
  • 逻辑分析仪的基本使用没有问题,但高级使用还存在一定的问题;
  • 推荐使用软件模拟IIC的方式

STM32常用协议之IIC协议详解相关推荐

  1. ARP协议及ARP欺骗详解

    ARP协议及ARP欺骗详解 地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议.主机发送信息时将包含目标IP地址的ARP ...

  2. HTTP协议的头信息详解

    HTTP协议的头信息详解 http://blog.csdn.net/guoguo1980/archive/2008/07/14/2649658.aspx HTTP协议的头信息详解 HTTP(Hyper ...

  3. [转]HTTP协议之状态码详解

    HTTP协议之状态码详解 HTTP状态码,我都是现查现用. 我以前记得几个常用的状态码,比如200,302,304,404, 503. 一般来说我也只需要了解这些常用的状态码就可以了.  如果是做AJ ...

  4. IP协议相关技术终极详解

    IP协议相关技术终极详解 DNS域名解析协议 概述 域名的层级关系 域名的解析流程 ARP地址解析协议 概述 为什么需要ARP协议? ARP协议是属于哪一层呢? ARP协议和DNS协议的区别 ARP协 ...

  5. FTP协议及工作原理详解

    FTP协议及工作原理详解 1. FTP协议 什么是FTP呢?FTP 是 TCP/IP 协议组中的协议之一,是英文File Transfer Protocol的缩写. 该协议是Internet文件传送的 ...

  6. Modbus通讯协议的原文和详解

    这个协议很早以前就被公开发表了,现在Modbus已经成为工业领域通信协议的业界标准,有网站专门进行协议的整理和管理. 这里必须要吐槽一下,我就想查查协议发布时的原始文档,或者这个协议的英文原文和官方版 ...

  7. HTTP协议的头信息详解 1

    HTTP协议的头信息详解 我用抓包软件抓了http的包,发现accept大多数有两种情况. # l8 X" o; I5 e# t9 y第一种:Accept: image/gif, image ...

  8. 《HTTP/2基础教程》协议、特性、详解

    文章目录 <HTTP/2基础教程>协议.特性.详解 前言 第一章 HTTP进化史 第二章 HTTP/2 快速入门 第三章 Web优化"黑魔法"的动机与方式 HTTP/1 ...

  9. UART, SPI, IIC的详解及三者的区别和联系

    1.UART, SPI, IIC的详解 UART.SPI.IIC是经常用到的几个数据传输标准,下面分别总结一下: UART(Universal Asynchronous Receive Transmi ...

  10. IIC通信协议详解 PCF8591应用(Verilog实现FPGA)

    IIC通信协议详解 & PCF8591应用(Verilog实现/FPGA) 该文章结合PCF8591 8-bit AD/DA 模数/数模转换器来详细介绍IIC通信协议,尽量做到条理清晰,通俗易 ...

最新文章

  1. 使用bottle进行web开发:get的参数传递,form数据传递等
  2. shell学习之shell基础知识了解
  3. qdbus 复杂类型
  4. ad采样频率_使用AD5933分析复阻抗的时钟频率设置
  5. PyCharm安装开发游戏的Pygame
  6. [转]浅谈CMD和win powershell的区别
  7. js中push(),pop(),unshift(),shift()的用法小结
  8. KNN代码复现python版
  9. python 内置运算
  10. HDOJ HDU 1849 Rabbit and Grass ACM 1849 IN HDU
  11. 在django项目中使用django-ckeditor
  12. NSArray 和 NSMutableArray
  13. python函数速查手册_Pandas常用函数速查手册中文版
  14. 1年时间,年薪增加10万,前端小兵的我是如何做到的?
  15. tf.shape用法
  16. windows系统的备份和还原
  17. 电话交换机tdmx2000dx硬件配置说明
  18. 快递查询工具,一键查物流,派件时效怎么分析
  19. 爬虫的基本原理:网络爬虫、爬虫基本流程、解析方式、保存数据
  20. HR 开发技术(abap 转载)

热门文章

  1. 国产激光打印机控制系统解决方案
  2. c624芯片服务器,FPGA-现场可编程门阵列AX2000-1CGS624M763MHz封装CCGA624
  3. 【臻选素材】51张高质量的精品置换贴图
  4. 用UItraISO做U盘的启动盘(图文教程)
  5. FIO – IO压力测试工具
  6. python 近义词库包 synonyms 的使用
  7. 分享前后端实现唤起微信扫一扫小demo
  8. python学习之python爬虫原理
  9. ntpd与ntpdate的区别
  10. Matlab之基于MTI雷达生成表面杂波和目标回波(附源码)