文章目录

  • 读LM75温度值
  • 读写AT24C256 EEPROM
  • IIC时序分析
  • 软复位
  • 状态跳转图
  • LM75寄存器
  • verilog实现
  • tb

LM75.pdf 下载
AT24C128.pdf 下载

读LM75温度值


上面是UART转IIC,本文只记录IIC接口的实现。
读出温度寄存器为 18C0 = 195*0.125=24.375度和屋内的净化器显示温度差不多。

读写AT24C256 EEPROM


IIC时序分析

a)通过观察IIC的时序图,可以分为4种基本类型:
1. start时序
2. 写入8bit+读1bit从ack时序
3. 读8bit+写1bit主ack时序
4. stop时序
b)原则
6. 过渡时间段:scl=0,sda任意,只要保证在scl上升沿之前,sda是想要的值就可。
7. scl=0,sda才能改变。因为scl=0期间,sda可以任意变化。
c)注意
8. EEPROM有写入的次数限制,写入次数超额会无法写入。
9. 两次写入之间要留空隙时间约5ms
建立时间和保持时间要求(可不用细看)
EEPROM的sda作为输入信号,对FPGA的sda数据要求
sda建立时间:scl上升沿之前至少100ns
sda保持时间:scl下降沿沿之后至少0ns
start下降沿的要求:
sda下降沿距右边scl下降沿至少600ns
sda下降沿距左边scl上升沿至少600ns
stop上升沿的要求:
sda=1至少保持1300ns
sda上升沿距左边scl上升沿至少600ns
1MHz   ----  1000ns
100Khz ----  10_000ns

写操作
单Byte写的顺序是:开始–设备地址–设备响应–写的地址–设备响应–(写数据–设备响应)…–(写数据–设备响应)–停止。

读操作
多Byte读的顺序是:开始–设备地址–设备响应–读的地址–设备响应–开始–设备地址–设备响应–(读数据–主机响应)…–(读数据–主机响应)–停止。

软复位

状态跳转图

LM75寄存器

OS pin : Overtemperature Shutdown output; open-drain.
设备地址:7'b1001xxx
温度寄存器地址是8'b0
温度[15:0]只取[15:5],单位是0.125度

verilog实现

//两次写入start与stop之间,最少空闲5ms
`timescale 1ns/1ns
// `define   SIM_OPEN 1
module iic_ctrl(input               clk                     ,input               rst                     ,input               scl_i                   ,output reg          scl_o                   ,// _o表示本模块的输出端口output reg          scl_is_out=0            ,//1:输出input               sda_i                   ,output reg          sda_o                   ,output reg          sda_is_out=0            ,//1:输出input   [1:0]       ADDR_NUM                ,//1-3表示1-3 Byte  0无意义input               DATA_NUM                ,//0:1Byte     1:2Byteinput   [6:0]       DEV_ADDR                ,//设备地址input               req                     ,output  reg         ack                     ,output  reg         ack_p                   ,//比ack提前1拍input               wr                      ,input   [23:0]      addr                    ,//2GB//先发送高地址MSBinput   [7:0]       wdata                   ,output reg[15:0]    rdata                    //1次读2B
);
//以scl为参考,只关注scl的跳变,每次scl跳变计时器开始清0//每个底层状态进入的第一个状态就是WAIT,其作用就是表示是低电平的开始,需要分配低电平的内容。
// 时序参数设置不要卡边,一定要留有时序裕量,因为线路长度不确定。
// 时序图中start时为什么scl是从0开始?因为是restart会有这种情况,正常是从1开始。
//关键是从设备的sda是输入转为输出,主设备需要提前释放。主设备50ns释放总线。
// 从设备sda是输出转输入,主设备需要等待从设备sda释放。手册没找到是多久?parameter           tSYSCLK =20             ;//单位ns
// 如果是max 400K,时钟周期是2500ns//隐含关系tLOW+tHIGH=tCLKparameter           tCLK    =4000/tSYSCLK   ;//单位ns//手册最小值600nsparameter           tLOW    =2000 /tSYSCLK   ;//单位ns//手册最小值600nsparameter           tHIGH   =(tCLK-tLOW);//单位ns//手册最小值1300nsparameter           tHDDAT  =1000/tSYSCLK    ;//单位ns//手册最小值000nsparameter           tSUDAT  =tLOW-tHDDAT           ;//单位ns//手册最小值100ns//cur_state;
parameter DLY = 1;
`ifdef SIM_OPEN
//底层状态
parameter START_SCLL              = "START_SCLL";
parameter START_SCLH              = "START_SCLH";
parameter START_GACK              = "START_GACK";parameter STOP_SCLL               = "STOP_WAIT ";
parameter STOP_SCLH               = "STOP_DASU ";
parameter STOP_GACK               = "STOP_GACK ";parameter W1BY_SCLL               = "W1BY_SCLL ";//写数据scl=0
parameter W1BY_SCLH               = "W1BY_SCLH ";//写数据scl=1
parameter W1AK_SCLL               = "W1AK_SCLL ";//写数据ACK scl=0
parameter W1AK_SCLH               = "W1AK_SCLH ";//写数据ACK scl=1
parameter W1BY_GACK               = "W1BY_GACK ";//产生ACK parameter R1BY_SCLL               = "R1BY_SCLL ";//读数据scl=0
parameter R1BY_SCLH               = "R1BY_SCLH ";//读数据scl=1
parameter R1AK_SCLL               = "R1AK_SCLL ";//读数据ACK scl=0
parameter R1AK_SCLH               = "R1AK_SCLH ";//读数据ACK scl=1
parameter R1BY_GACK               = "R1BY_GACK ";//产生ACK //main状态
parameter MAIN_IDLE               = "MAIN_IDLE ";
parameter MAIN_STAR               = "MAIN_STAR ";
parameter MAIN_DEV0               = "MAIN_DEV0 ";
parameter MAIN_ADDR               = "MAIN_ADDR ";
parameter MAIN_REST               = "MAIN_REST ";
parameter MAIN_DEV1               = "MAIN_DEV1 ";
parameter MAIN_R8BI               = "MAIN_R8BI ";//读设备的内容
parameter MAIN_W8BI               = "MAIN_W8BI ";//写从设备的空间
parameter MAIN_STOP               = "MAIN_STOP ";
reg[127:0] cur_state,cur_state_1d,per_main_state;//下一个进入的main状态
`else
parameter START_SCLL              = 'd0;
parameter START_SCLH              = 'd1;
parameter START_GACK              = 'd2;
parameter STOP_SCLL               = 'd3;
parameter STOP_SCLH               = 'd4;
parameter STOP_GACK               = 'd5;
parameter W1BY_SCLL               = 'd6;//写数据scl=0
parameter W1BY_SCLH               = 'd7;//写数据scl=1
parameter W1AK_SCLL               = 'd8;//写数据ACK scl=0
parameter W1AK_SCLH               = 'd9;//写数据ACK scl=1
parameter W1BY_GACK               = 'd10;//产生ACK
parameter R1BY_SCLL               = 'd11;//读数据scl=0
parameter R1BY_SCLH               = 'd12;//读数据scl=1
parameter R1AK_SCLL               = 'd13;//读数据ACK scl=0
parameter R1AK_SCLH               = 'd14;//读数据ACK scl=1
parameter R1BY_GACK               = 'd15  ;//产生ACK //main状态
parameter MAIN_IDLE               = 'd20;
parameter MAIN_STAR               = 'd21;
parameter MAIN_DEV0               = 'd22;
parameter MAIN_ADDR               = 'd23;
parameter MAIN_REST               = 'd24;
parameter MAIN_DEV1               = 'd25;
parameter MAIN_R8BI               = 'd26;//读设备的内容
parameter MAIN_W8BI               = 'd27;//写从设备的空间
parameter MAIN_STOP               = 'd28;
reg[4:0] cur_state,cur_state_1d,per_main_state;
`endif
// 分2部分:
// main状态 流程实现上层的控制。
// 底层状态是控制bit级别。reg     [7:0]       wdata_reg               ;reg     [0:0]       req_reg                 ;reg     [15:0]      delay_cnt               ;//1拍=20ns//延时的拍数reg     [1:0]       addr_cnt                ;//Byte 计数reg     [1:0]       data_cnt                ;//Byte 计数 读写个数reg     [7:0]       bit_cnt                 ;//bit 计数:已经发送的0开始,1Byte中的bit数reg     [7:0]       wdata_shft              ; //多一位用来弥补第一次左移的问题reg                 down_ack                ;//底层的ackreg                 err_ack                 ;//底层的ack是否错误 1:错误wire                state_change            ;//新状态的sopassign   state_change = (cur_state_1d==cur_state)?1'b0:1'b1;//各个底层的req在main流程解除,ack会持续多拍
always@(posedge clk or posedge rst) beginif(rst)begincur_state<= #1 MAIN_IDLE;end else begincase(cur_state)
//MAINMAIN_IDLE:if(req)cur_state<= #1 MAIN_STAR;MAIN_STAR:if(down_ack)cur_state<= #1 MAIN_DEV0;elsecur_state<= #1 START_SCLL;MAIN_DEV0:if(down_ack&err_ack)cur_state<= #1 MAIN_STOP;else if(down_ack&(~err_ack) )cur_state<= #1 MAIN_ADDR;elsecur_state<= #1 W1BY_SCLL;MAIN_ADDR:if(down_ack&err_ack)cur_state<= #1 MAIN_STOP;else if(down_ack&(~err_ack)&(addr_cnt>=ADDR_NUM) )if( ~wr )//读cur_state<= #1 MAIN_REST;else cur_state<= #1 MAIN_W8BI;             elsecur_state<= #1 W1BY_SCLL;MAIN_REST:if(down_ack)cur_state<= #1 MAIN_DEV1;elsecur_state<= #1 START_SCLL;MAIN_DEV1:if(down_ack&(~err_ack))if( ~wr )//读cur_state<= #1 MAIN_R8BI;else //写cur_state<= #1 MAIN_W8BI;else  if (down_ack&(err_ack))cur_state<= #1 MAIN_STOP;elsecur_state<= #1 W1BY_SCLL;MAIN_R8BI:if(down_ack&&(data_cnt>=DATA_NUM+1) )cur_state<= #1 MAIN_STOP;elsecur_state<= #1 R1BY_SCLL;MAIN_W8BI:if(down_ack&err_ack)cur_state<= #1 MAIN_STOP;else if(down_ack&(~err_ack) )cur_state<= #1 MAIN_STOP;elsecur_state<= #1 W1BY_SCLL;MAIN_STOP:if(down_ack)cur_state<= #1 MAIN_IDLE;elsecur_state<= #1 STOP_SCLL;
//startSTART_SCLL:if(delay_cnt>=tLOW)cur_state<= #1 START_SCLH;  START_SCLH:if((delay_cnt>=2*tHIGH)&(~state_change))cur_state<= #1 START_GACK;          START_GACK:cur_state<= #1 per_main_state;
//W8BITW1BY_SCLL:if((delay_cnt>=tLOW)&(~state_change))cur_state<= #1 W1BY_SCLH;W1BY_SCLH:if((delay_cnt>=tHIGH)&(~state_change))if(bit_cnt>=8)//已经发送了8bit(0-7),下面就是接收ackcur_state<= #1 W1AK_SCLL;//接收ackelse cur_state<= #1 W1BY_SCLL;//继续发送数据W1AK_SCLL:if((delay_cnt>=tLOW)&(~state_change))cur_state<= #1 W1AK_SCLH;W1AK_SCLH:if((delay_cnt>=tHIGH)&(~state_change))cur_state<= #1 W1BY_GACK;W1BY_GACK:cur_state<= #1 per_main_state;
//R8BITR1BY_SCLL:if((delay_cnt>=tLOW)&(~state_change))cur_state<= #1 R1BY_SCLH;R1BY_SCLH:if((delay_cnt>=tHIGH)&(~state_change))if(bit_cnt>=8)//已经发送了8bit(0-7),下面就是接收ackcur_state<= #1 R1AK_SCLL;//接收ackelse cur_state<= #1 R1BY_SCLL;//继续发送数据R1AK_SCLL:if((delay_cnt>=tLOW)&(~state_change))cur_state<= #1 R1AK_SCLH;R1AK_SCLH:if((delay_cnt>=tHIGH)&(~state_change))cur_state<= #1 R1BY_GACK;R1BY_GACK:cur_state<= #1 per_main_state;
//stopSTOP_SCLL:if(delay_cnt>=tLOW)cur_state<= #1 STOP_SCLH;  STOP_SCLH:if((delay_cnt>=2*tHIGH)&(~state_change))cur_state<= #1 STOP_GACK;          STOP_GACK:cur_state<= #1 per_main_state;              default:cur_state<= #1 MAIN_IDLE;endcaseend
end
//状态输出
always@(posedge clk or posedge rst) beginif(rst)begincur_state_1d    <= #1 MAIN_IDLE;per_main_state  <= #1 MAIN_IDLE;addr_cnt        <= #1 0;data_cnt        <= #1 0;down_ack        <= #1 0;scl_o           <= #1 1;scl_is_out      <= #1 0;//1:输出sda_o           <= #1 1;sda_is_out      <= #1 0;//1:输出wdata_shft      <= #1 0;//1:输出ack             <= #1 0;//1:输出// ack_p           <= #1 0;//1:输出end else begincur_state_1d    <= #1 cur_state;ack    <= #1 ack_p;case(cur_state)
//MAINMAIN_IDLE:begin//per_main_state  <= #1 MAIN_IDLE;addr_cnt        <= #1 0;data_cnt        <= #1 0;down_ack        <= #1 0;scl_o           <= #1 1;scl_is_out      <= #1 0;//1:输出sda_o           <= #1 1;sda_is_out      <= #1 0;//1:输出wdata_shft      <= #1 'b0;bit_cnt         <= #1 0;// ack             <= #1 0;                        // ack_p           <= #1 0;                        endMAIN_STAR:begin//per_main_state  <= #1 MAIN_STAR;down_ack        <= #1 0;endMAIN_DEV1:begin//per_main_state  <= #1 MAIN_DEV1;addr_cnt        <= #1 0;data_cnt        <= #1 0;down_ack        <= #1 0;bit_cnt         <= #1 0;wdata_shft      <= #1 {DEV_ADDR[6:0],(~wr)};//写入设备地址endMAIN_DEV0:begin//per_main_state  <= #1 MAIN_DEV0;addr_cnt        <= #1 0;data_cnt        <= #1 0;down_ack        <= #1 0;bit_cnt         <= #1 0;wdata_shft      <= #1 {DEV_ADDR[6:0],1'b0};//写入设备地址endMAIN_ADDR:begin//per_main_state  <= #1 MAIN_ADDR;down_ack        <= #1 0;bit_cnt         <= #1 0;            if(ADDR_NUM==1)//1B 地址wdata_shft      <= #1 addr[7:0]; else if(ADDR_NUM==2)//2B 地址if(addr_cnt==0)//已经发送0个addrwdata_shft      <= #1 addr[15:8];else//已经发送1个addrwdata_shft      <= #1 addr[7:0]; endMAIN_REST:begin//per_main_state  <= #1 MAIN_REST;down_ack        <= #1 0;bit_cnt         <= #1 0;            data_cnt        <= #1 0;endMAIN_R8BI:begin//per_main_state  <= #1 MAIN_R8BI;down_ack        <= #1 0;bit_cnt         <= #1 0;            endMAIN_W8BI:begin//per_main_state  <= #1 MAIN_W8BI;down_ack        <= #1 0;bit_cnt         <= #1 0;           wdata_shft      <= #1 wdata[7:0]; endMAIN_STOP:begin//per_main_state  <= #1 MAIN_STOP;down_ack        <= #1 0;bit_cnt         <= #1 0;            // ack             <= #1 1; // ack_p           <= #1 0;         end//开始信号产生           START_SCLL:begin//if(delay_cnt==0)//scl和sda都设置为输出beginscl_o           <= #1 0;scl_is_out      <= #1 1;//1:输出// sda_o           <= #1 1;sda_is_out      <= #1 1;//1:输出endelse if(delay_cnt==tHDDAT)sda_o          <= #1 1; end START_SCLH:beginif(delay_cnt==0) scl_o           <= #1 1;else if((delay_cnt>=2*tHIGH)&(~state_change))//sda产生下降沿输出scl_o           <= #1 0;else if((delay_cnt>=tHIGH)&(~state_change))//sda产生下降沿输出sda_o           <= #1 0;            end        START_GACK:down_ack           <= #1 1;
//写8bit时序产生W1BY_SCLL:begin//if(delay_cnt==0)beginscl_o           <= #1 0;scl_is_out      <= #1 1;//1:输出endelse if(delay_cnt==tHDDAT)beginsda_is_out      <= #1 1;//1:输出          sda_o           <= #1 wdata_shft[7];wdata_shft[7:0] <= #1 {wdata_shft[6:0],1'b0};endend                 W1BY_SCLH:if(delay_cnt==0)beginscl_o           <= #1 1;bit_cnt         <= #1 bit_cnt+1;endelse if(delay_cnt==tHIGH)//scl高电平之后负责将scl拉低scl_o           <= #1 0;W1AK_SCLL:beginif(delay_cnt==tHDDAT)sda_is_out      <= #1 0;//1:输出end                 W1AK_SCLH:if(delay_cnt==0)scl_o           <= #1 1;else if( (delay_cnt==tHIGH-3) &(~state_change))//在时钟下降沿之前采样err_ack           <= #1 sda_i;else if(delay_cnt==tHIGH)//scl高电平之后负责将scl拉低scl_o           <= #1 0;            W1BY_GACK:begindown_ack           <= #1 1;addr_cnt           <= #1 addr_cnt +1;end
//读8bit时序产生R1BY_SCLL:begin//if(delay_cnt==0)scl_o           <= #1 0;else if(delay_cnt==tHDDAT)sda_is_out      <= #1 0;//1:输出          end                 R1BY_SCLH:if(delay_cnt==0)beginscl_o           <= #1 1;endelse if((delay_cnt==tHIGH-3) &(~state_change))beginrdata[15:0]     <= #1 {rdata[14:0],sda_i};bit_cnt         <= #1 bit_cnt+1;            endelse if(delay_cnt==tHIGH)//scl高电平之后负责将scl拉低scl_o           <= #1 0;R1AK_SCLL:beginif(delay_cnt==tHDDAT)beginsda_is_out      <= #1 1;//1:输出sda_o           <= #1 ((data_cnt===DATA_NUM));endend                 R1AK_SCLH:if(delay_cnt==0)scl_o           <= #1 1;else if(delay_cnt==tHIGH)//scl高电平之后负责将scl拉低scl_o           <= #1 0;            R1BY_GACK:begindown_ack           <= #1 1;data_cnt           <= #1 data_cnt +1;end//停止信号产生           STOP_SCLL:begin//if(delay_cnt==0)//scl和sda都设置为输出beginscl_o           <= #1 0;scl_is_out      <= #1 1;//1:输出sda_is_out      <= #1 1;//1:输出endelse if(delay_cnt==tHDDAT)sda_o          <= #1 0; end STOP_SCLH:beginif(delay_cnt==0) scl_o           <= #1 1;else if((delay_cnt==tSUDAT)&(~state_change))// sda_o          <= #1 1; else if((delay_cnt>=tSUDAT + tHIGH)&(~state_change))//释放总线sda_is_out      <= #1 0;//1:输出end        STOP_GACK:begindown_ack           <= #1 1;         end     endcaseend
end
//delay_cnt
always@(posedge clk or posedge rst)beginif(rst)delay_cnt       <= #1 0;else if(state_change)delay_cnt       <= #1 0;elsedelay_cnt       <= #1 delay_cnt+1;
end always@(posedge clk or posedge rst)beginif(rst)ack_p       <= #1 0;else  ack_p       <= #1 (cur_state== STOP_SCLL)  &state_change;
end
always@(posedge clk or posedge rst)if(rst)beginwdata_reg       <= #1 0;req_reg       <= #1 0;endelse if(req_reg!=req)beginwdata_reg       <= #1 wdata;req_reg         <= #1 req;endelsereq_reg         <= #1 req;
endmodule

tb

`timescale 1ns/100ps
module tb (  );reg                 clk =0                  ;reg                 rst =1                  ;
always clk =#10  ~clk;logic               req                     ;logic               ack                     ;logic               wr                      ;logic   [31:0]      addr                    ;//4GBlogic   [7:0]       wdata                   ;logic   [15:0]      rdata                   ;//1次读2B
//part 2
task  send ;// send('d4,'haa)input   [31:0]      waddr                  ;input   [7:0]       send_wdata                  ;req      =  'b0;wr       =  'b0;addr     =  'b0;wdata    =  'b0;@(posedge clk);#1;req      =  'b1;wr       =  'b1;addr     =  waddr;wdata    =  send_wdata;@(posedge ack);@(posedge clk);#1;req      =  'b0;wr       =  'b0;addr     =  'b0;wdata    =  'b0;
endtask
task  read ;// read('d55);input   [31:0]      raddr                  ;req      =  'b0;wr       =  'b0;addr     =  'b0;wdata    =  'b0;@(posedge clk);#1;req      =  'b1;wr       =  'b0;addr     =  raddr;@(posedge ack);@(posedge clk);#1;req      =  'b0;wr       =  'b0;addr     =  'b0;wdata    =  'b0;
endtask
iic_ctrl u0_iic_ctrl(.clk                (clk                   ),//input               clk                     ,.rst                (rst                   ),//input               rst                     ,.scl_i              (1                     ),//input               scl_i                   ,.scl_o              (                      ),//output              scl_o                   ,// _o表示本模块的输出端口.scl_is_out         (                      ),//input               scl_dir                 ,//1:输出.sda_i              (0                     ),//input               sda_i                   ,.sda_o              (                      ),//output              sda_o                   ,.sda_is_out         (                      ),//input               sda_dir                 ,.ADDR_NUM           (1                     ),//input   [1:0]       ADDR_NUM                ,//1-3表示1-3 Byte  0无意义.DATA_NUM           (1                     ),//input               DATA_NUM                ,//0:1Byte     1:2Byte.DEV_ADDR           (7'b1001000                  ),//input               DATA_NUM                ,//0:1Byte     1:2Byte.req                (req                   ),//input               req                     ,.ack                (ack                   ),//output  reg         ack                     ,.wr                 (wr                    ),//input               wr                      ,.addr               (addr                  ),//input   [23:0]      addr                    ,//2GB.wdata              (wdata                 ),//input   [7:0]       wdata                   ,.rdata              (                      ) //output reg[15:0]    rdata                    //1次读2B
);
initial beginreq      =  'b0;wr       =  'b0;addr     =  'b0;wdata    =  'b0;rst =1; #100; rst =0;//复位#200;read('h765432);#5_000;// send('b10010010_10010010,'haa);// #50_000;$stop();
end
endmodule

Verilog IIC AT24C128和LM75相关推荐

  1. IIC总线的原理与Verilog实现

    IIC总线的原理与Verilog实现 1. 软件平台与硬件平台 2. 原理介绍 2.1 IIC总线的特点: 2.2 IIC总线协议详解: 2.2.1 IIC主机往从机里面写入数据的步骤 2.2.2 I ...

  2. fpga驱动oled iic显示代码_【接口时序】6、IIC总线的原理与Verilog实现

    欢迎FPGA工程师加入官方微信技术群 点击蓝字关注我们FPGA之家-中国最好最大的FPGA纯工程师社群 一. 软件平台与硬件平台 软件平台: 1.操作系统:Windows-8.1 2.开发套件:ISE ...

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

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

  4. Verilog实现IIC协议读写EEPROM

    在FPGA设计中,IIC协议是一个十分常见的协议,因为几乎所有的EEPROM都是用这个协议进行读写的,此外,一些特殊场合,也会用到此协议.这里我首先给出IIC协议的中文标准文档的下载链接(不要积分), ...

  5. 基于FPGA的iic主从机驱动实现 Verilog实现iic slave和iic master

    基于FPGA的iic主从机驱动实现 Verilog实现iic slave和iic master 顶层模块实现master对slave自定义的寄存器读取 带仿真模块 ID:153069768739840 ...

  6. FPGA:IIC验证镁光EEPROM仿真模型(纯Verilog)

    目录 日常·唠嗑 一.程序设计 二.镁光模型仿真验证 三.testbench文件 四.完整工程下载 日常·唠嗑 IIC协议这里就不赘述了,网上很多,这里推荐两个,可以看看[接口时序]6.IIC总线的原 ...

  7. IIC协议驱动EEPROM的Verilog实现与竞争冒险与下降沿触发、多重驱动

    文章目录 一.前言 二.软硬件平台 软件平台 硬件平台 三.IIC与EEPROM IIC简介 1. 写操作大致步骤 2. 读操作大致步骤 3. IIC总线有以下几种状态 1. 空闲状态 2. 起始信号 ...

  8. IIC通讯 | 基于STM32的LM75模块的使用以及故障排查

    开幕先抱怨一下,小小模块没有说明文档,客服一问三不知,原理图也不提供,害人不浅,啊啊啊啊啊. 最初的设计中,LM75模块的电路是设计在了板子上 后来为了测温更加方便准确,选择了外接的方案,于是板子上只 ...

  9. IIC 总线协议(Verilog)

    IIC (Inter - Integrated Circuit BUS) 集成电路总线,它是一种串行通信总线,多使用主从架构.IIC 接口共有两条总线线路,即 SCL(串行时钟线).SDA(串行数据线 ...

最新文章

  1. python操作word填表_Python 自动化办公—Word 文本操作命令
  2. HTML5与CSS3基础教程第八版学习笔记16-21章
  3. TCP三次握手协议和SYN攻击以及DDOS简介
  4. vc++64位系统下long的长度为4个字节_新来的妹子把几百万数据放入了内存,系统立马爆了...
  5. 解锁并设置远程登录尝试次数
  6. 【已解决】Linux下安装JDK
  7. SAP Cloud for Customer和微信小程序的集成-原型开发示意图
  8. 华为全球分析师大会:HMS Core全球开发者应用集成的数量加速增长,打造全场景智慧体验...
  9. 最新中文文本挖掘小例子及程序
  10. 1004. 成绩排名 (20)
  11. 关于mysql的表情包_mysql表情包 - mysql微信表情包 - mysqlQQ表情包 - 发表情 fabiaoqing.com...
  12. 博客网页设计制作 简单静态HTML网页作品 DIV CSS个人网页作业成品 dreamweaver学生个人博客网站模板
  13. 野火ISO-V2学习
  14. epoll中的ET和LT模式区别
  15. 魔域单机服务器显示read,魔域boss点,单机假设相关信息(Demon boss point, single machine assumes relevant information).doc...
  16. 计算机win文件题型,《计算机应用基础》操作系统应用题型专项练习
  17. 考PMP真的有用吗?
  18. threejs中设置物体的贴图+场景的6面贴图 +创建空间
  19. 让沟通更高效的职场礼物,讯飞智能录音笔SR502值得入手
  20. D3.js从入门指南

热门文章

  1. jq向下滑动刷新_jQuery手势控制,下拉刷新
  2. nuget的原理_NuGet 跨平台插件
  3. matlab amesim联合仿真,AMESim与MATLAB_Simulink联合仿真接口配置
  4. 计算机导论ppt创意作品,《计算机导论》全套PPT电子课件教案-第1章 绪论.ppt
  5. 无源测向与时差定位技术研究matlab,一种基于时差信息的无源多站多目标测向交叉定位方法与流程...
  6. 查看B站UP开播状态(通过uid查询)
  7. Python_PyQuery使用
  8. 相片墙个人相册图片墙HTML源码
  9. NextJs 学习笔记
  10. cesiumjs开发实践 (一)