I2C学习总结

转载自
http://www.wangdali.net/i2c/
在此基础上总结加工

I2C总线(Inter Integrated-Circuit)是由PHILIPS公司在上世纪80年代发明的一种电路板级串行总线标准,通过两根信号线——时钟线SCL和数据线SDA——即可完成主从机的单工通信。总线硬件连接极其简单,不同I2C设备挂接在总线上,只需在信号线安装上拉电阻即可完成硬件线路的搭建。另外,I2C总线采用器件地址的硬件设置方法,通过软件寻址方式完全避免了片选寻址的弊端,从而使硬件系统扩展更为灵活。

由于简单有效,I2C在业界得到广泛应用。基于I2C衍生出来的标准有SMBus、PMBus、IPMI、DDC和ATCA等。常见集成I2C硬件接口的设备有微控制器、温度传感器、LED控制器、EEPROM、ADC/DAC、RTC、时钟振荡器和I/O控制器等。
I2C总线最主要的优点是其简单性和有效性,其次I2C支持多主机(Multi-Mastering),任何能够进行发送和接收的设备都可以成为主机。主机控制数据的传输和时钟的频率。在任何时间点只能有一个主机。因为只有两条线,在处理地址和应答时,I2C存在一定的开销,效率不如设备直接相连的SPI总线。

下面就I2C总线的主要特点、总线操作、同步和仲裁、电接口特点等作简单介绍。

一、主要特点

  • I2C只有两根信号线:串行数据线SDA和串行时钟线SCL;
  • I2C总线上所有器件的SDA、SCL引脚输出驱动都为漏极开路结构,通过外接上拉电阻实现总线- 上所有节点SDA、SCL信号的“线与”逻辑关系;
  • 总线上的所有设备通过软件寻址且具有唯一的地址(7位或10位)。7位“从机专用地址码”,其高4位为设备类型地址(由生产厂家制定),低3位为器件引脚定义地址(由使用者定义);10位地址不常见;
  • 任何时刻都只存在简单的主/从关系,按数据传输的方向,主机可以是主发送器或主接收器;
    支持多主机。在总线上存在多个主机时,通过冲突检测和仲裁机制防止多个主机同时发起数据传输时存在的冲突;
  • I2C总线上所有器件都具有“自动应答”功能,保证数据传输的正确性;
    主机和从机的区别在于对SCL的发送权,只有主机才能发送SCL;
  • I2C总线不仅广泛应用于电路板级的内部通信,还可以通过I2C总线驱动器进行不同系统间的通信;
  • 支持传输速率包括标准模式(Standard Mode)100kb/s、快速模式(Fast Mode)400kb/s、增强快速模式(Fast Mode Plus)1Mb/s和高速模式(High Speed Mode)3.4Mb/s;极速模式(Ultra-Fast Mode),单向数据传输速率可达5Mb/s;
  • I2C总线允许挂载最多的设备数量取决于总线上最大电容值,一般为400pf(Hs模式100pf)


    图1.1 I2C总线概念定义

    图1.2 I2C连接示意图

    I2C的数据(SDA)和时钟(SCL)信号都是双向的,通过电流源或上拉电阻接到电源(如图1.1所示),VDD大小取决于I2C设备接口的耐压能力。两根线都为高时,总线处于空闲状态(IDLE)。I2C接口的特殊构造以实现“线与”功能,即每个信号接口都分为输出的漏极开路(或集电极开路)和输入缓冲器部分。“线与”逻辑是I2C实现时钟同步和总线仲裁的硬件基础。

线与

漏极开路/集电极开路的特点是不能输出高电平,必须通过外接上拉输出高电平。如果总线上有任何一个设备接口输出低电平,则整个总线的状态表现为低电平,由此实现I2C总线信号的“线与”功能。

“线与”功能的好处在于可以实现总线的仲裁控制。总线的控制权会交给最后一个输出低电平的设备,其它设备(输出为高)通过检测总线上的电平状态(表现为低),对比与自己输出状态不一致,则自动退出对总线的控制请求。

漏极开路/集电极开路的缺点是对于一个距离长的数据线,信号传输速率得不到有效保证。更长的走线对于输出驱动器表现为更大的容性负载,等效容性负载C和信号线的上拉电阻R构成RC振荡器。RC越大,意味着反射和振荡越强,从而影响总线的信号完整性。这也是I2C规范对总线电容值约束在400pf以内的原因。高速模式(Hs)对信号完整性的要求更高,协议有定义相关SDA/SCL处理办法,以保证在数据线够长、速率够高时,信号完整性也可以得到满足。

二、总线操作

1.数据有效性

协议没有规定I2C逻辑“1”和“0”的电平值,参考实际应用中的VDD。每传输一比特数据SDA,对应产生一个时钟脉冲SCL。SCL为高时,SDA不允许变化;只有在SCL为低时,SDA才可以变化(图2.1)。


图2.1 位的传输

2.开始和结束条件

SDA和SCL的特定组合表示总线开始或结束一次数据传输。

开始条件(S):SCL为高时,SDA由高变低;
结束条件(P):SCL为高时,SDA由低变高。

图2.2 开始和结束条件

开始/结束条件总是由主机(Master)发起的。主机发出开始条件(START)后,总线处于忙的状态;主机发出结束条件(STOP)后,总线处于空闲状态。

在操作中,如果主机发出重复开始条件(repeated START,Sr)而非结束条件(STOP),则总线仍处于忙的状态。也就是说,重复开始条件(Sr)和开始条件(S)在功能上是相同的。在本文(协议)中,除非特别说明,开始条件和重复开始条件统一表述为S。

判断开始或结束条件对于具有相应逻辑接口的设备相对简单,对于没有该接口的微控制器,需要在每个SCL周期内对SDA至少采样2次,才能正确检测到开始或结束条件。

3.字节格式

SDA上传输字节数据必须是8比特长度,每次传输不限定传输的字节数。每个字节(8位)数据传送完毕后紧接着应答信号(第9位,Acknowledge Bit)。数据传输过程中,先发送高位(MSB),再发送低位(LSB),如图2.3示。如果在数据传输过程中,从机如果没有准备好接收或发送下一个字节(比如内部中断需要处理等),它可以通过拉低SCL强制主机进入等待状态。直到从机释放SCL,主机才开始下一个字节的发送或接收。


图2.3 I2C总线的数据传输

4.应答

协议规定数据传输过程必须包含应答。接收器通过应答(1 bit)通知发送的字节已被成功接收,发送器可以进行下一个字节的传输。主机产生数据传输过程中的所有时钟,包括应答的第9个时钟。发送器在应答时钟周期内释放对SDA的控制,这样接收器可以通过将SDA拉低通知发送器数据已被成功接收(图2.4)。


图2.4 I2C总线数据应答

参照图2.1说明,SCL为高的时候,SDA数据才是有效的,因此接收器发送ACK时,要保证SCL为高的同时,SDA为低电平;建立和保持时间也要满足规范要求。如果在第9个时钟周期,SDA为高,表明接收器无应答(NACK),主机可以据此发出结束条件(STOP)命令结束此次传输,或发起重传请求(repeated START)重新传输数据。有5种情况可能导致无应答(NACK):

  • 总线上没有对应地址的接收器件;
  • 接收器件没有准备好与主机的通信;
  • 接收器件无法解析读取的数据;
  • 接收器件无法收取更多的数据;
  • 主机作为接收器(Master-Receiver)时,在读取从机(Slave-Transmitter)发出的最后一个字节数据后,发出NACK通知从发送器释放数据线SDA,以便主机发起结束(STOP)或重传(Sr)指令。

图2.5表示主机作为发送器和接收器在写和读情况下的数据格式(ACK/NACK)。

图2.5 I2C数据读写格式

三、时钟同步和仲裁

I2C的一大特点是可以在同一条总线上接多个主机。两个及以上的主机同时发起传输请求时,需要通过某种机制确定哪个主机获得总线的使用权;另外,每个主机都独立产生时钟,时钟速率可能千差万别,这也需要某种机制解决时钟速率不一致的问题。这种机制就是时钟同步(Clock Synchronization)和仲裁(Arbitration)。在单主机的I2C系统中,不需要时钟同步和仲裁。

1.时钟同步

每个I2C的主机内部都有两个计数器,分别计数SCL上高电平和低电平的时间。如果总线上只有一个主机,则这两个计数器的值决定系统时钟速率。当多个主机存在时,不同设备的计数器速度可能不一致,因此涉及时钟同步的概念。

时钟同步是通过I2C接口的“线与”逻辑实现的。SCL信号线由高变低时,所有连接在SCL上的主机都开始计数低电平的时间(低电平计数器复位),由前文对“线与”逻辑的介绍可知:只有当SCL总线上所有主机的时钟输出端都为高时,SCL总线才会由低变高。SCL的低电平时间由总线上低电平时间最长的主机决定。时钟端口先跳变为高的其它主机进入等待状态(图3.1)。这样所有主机的时钟输出和SCL线上的状态保持相同;当SCL由低变高后,所有主机(高电平计数器)开始计数SCL高电平的时间;最早由高跳变到低的主机再次将SCL拉低。通过这种方式产生的同步时钟:其低电平时间是所有主机时钟中最长的低电平时间,其高电平时间是所有主机时钟中最短的高电平时间。


图3.1 仲裁阶段的时钟同步

2.仲裁

当总线上有一个以上的主机时,协议通过仲裁的方法确定哪个主机获得总线的使用权。从机不参与仲裁的过程。

当总线处于空闲状态(IDLE)时,在最小的保持时间内(tHD;STA),多个主机都可能发起开始条件(START)在总线上传输数据。仲裁用来判断哪个主机的传输可以正常进行。

仲裁是按位进行的。仲裁开始时,对于每一位数据,SCL为高时,每个主机都检测SDA上的数据是否和自己发送的数据相同。可能需要进行多个位(bit)的比较,主机才开始检测到SDA上数据和自己发送的不一致。实际上,只要SDA上的数据和主机发送的数据一致,这些主机就可以将数据一致发送下去。当主机发送为HIGH,检测SDA上电平却为LOW,那么该主机就在仲裁中失去主控权,并将其SDA输出关闭。余下的主机获得总线控制权并继续数据的传输。如图3.2 ,当主机1在检测到SDA数据和它自身的输出DATA1不一致时,将自动关闭DATA1的输出,停止向总线上发送数据。

由此可见,在仲裁过程中胜出的主机是没有丢失数据的。在仲裁中失去总线控制权的主机在本次字节传输结束后继续产生时钟,并在总线空闲时开始上次数据的重传。如果同一个器件可以工作在主从两种模式,它在仲裁过程中失去总线控制权,那么有可能是仲裁胜出的主机将要访问该器件,该器件应该立即切换到从机模式。


图3.2 两个主机的仲裁过程

从上面的原理分析可知,I2C不存在核心主机,是没有优先级的概念的。总线的控制权仅取决于主机在SDA上的竞争(SDA包含地址和数据)。

在仲裁过程中,存在以下未定条件会导致不可预期的结果:

  • 主机1在主机2发送数据的过程中发出重复开始条件(Sr)
  • 主机1在主机2发送数据的过程中发出结束条件(P)
  • 主机1在主机发出结束条件(P)的过程中发出重复开始条件(Sr)

3.Clock Stretching

通过拉低SCL延迟数据的传输。Clock Stretching 是可选功能,实际上许多从机不包括SCL驱动器,因此也无法延迟时钟。

在字节级的数据传输中,接收器在下一个字节接收前,可能需要一段时间存储上一个接收的字节。从机可以在接收字节和发送ACK后将SCL置低,通知发送器延迟数据的发送,直到从机准备好,再次将SCL释放为止。从机以一种握手机制迫使主机进入等待状态,直到从机准备好接收下一个字节。

在位级的数据传输中,设备(例如有或没有I2C总线接口逻辑的微控制器)可以通过延长每个时钟的低电平时间降低总线的时钟速率,由此使得任何主机的速度都可以适配总线上设备的内部工作速率。

在Hs 模式,握手机制只在字节级数据传输中使用。

四、数据/地址模式

1.七位地址系统

开始条件(S)后的第一个字节包括寻址的从机地址(7 bit)和数据方向控制位R/W(1 bit),如图4.1。其中第8位数据方向控制位R/W:

0:主机写数据 TO 从机
1:主机读数据 FROM 从机


图4.1 START后的第一个字节格式

由读写位的特点可知对于I2C总线上的第一个字节,读操作都是奇数,写操作是偶数。有的厂商提供的是8位地址(包括读写位),这样对于读写会有两个不同的地址。更合理的办法是直接提供唯一的7位地址。如图4.2所示。


图4.2 7位vs8位地址

主机发送结束条件(P)终止一次传输。主机也可以通过发起重复开始条件(Sr)进行一次新的传输,而不需要先产生结束条件(P)。在一次传输过程中,可能存在多种读写组合,包括:
  • 主机作为发送,向从机发送(写)数据,传输的方向不变(图4.3);


    图4.3 7位地址主发从收模式
  • 主机发送开始条件(S)以及其后的第一个字节,立即改为从总线上读取状态。收到从机的应答(ACK)后,主机由主发模式切换到主收模式,从机由从收模式切换到从发模式。第一个应答是从机发出的。主机先发送NACK,再发送结束条件(P)结束本次传输(图4.4);


    图4.4 主机在第一个字节后立即读取从机内容
  • 混合模式(图4.5)。


    图4.5 混合模式

2.十位地址系统

采用10位地址系统扩充了I2C系统的地址范围。7位和10位地址设备可以共存于同一个I2C总线系统,并且可工作在所有速度模式。目前,使用10位地址系统的I2C设备不多。

10位从机地址由紧接着START(或Repeated Start)后的两个字节定义。

第一个字节的前七位格式为1111 0XX,其中最后两位XX表示10位地址空间的最高两位(MSB);第一个字节的第八位R/W,表示数据的方向。注意,第一个字节前七位1111 1XX为预留,方便未来协议升级。

所有7位地址系统包括的读/写模式,在10位地址系统中同样存在。举例其中两条如下:

  • 主发送器向10位地址的从接收器发送数据。如图14所示,在整个过程中,数据传送方向没有改变。在START发起之后,所有从机对比总线上第一个字节的前七位(1111 0XX)是否和自身地址一致,并检测第八位是否为0(写)。可能有一个以上设备会检测到地址匹配(因为只对比了10位地址的最高2位),它们都会产生响应A1。接下来,所有上面响应的从机对比总线上第二个字节和它们各自地址的后八位(XXXX XXXX)是否一致。只有一个设备的地址匹配,并产生响应A2。被寻址的从机一直受主机控制,直到STOP或Sr指向另外的地址;


    图4.6 主发送器寻址从接收器(十位地址空间)
  • 主接收器读取10位地址的从发送器发送的数据。数据传送方向在第二个R/W后发生改变。如图15所示,A2之前的操作和主发送器向从接收器写数据没有区别。通过Sr,匹配地址的从机得知它就是被寻址的设备,接下来从机检测Sr后的七个比特是否和先前START后的七比特一致(1111 0XX),并检测第八位(R/W)是否为1。如果是,则从机据此判断它被寻址并将要作为发送器往总线上发送数据,此时从机产生响应A3。从机一直占用总线,直到接收到STOP或Sr指向另一个从机地址。收到Sr信号后,所有从机都会对比Sr后第一个字节的前七位(1111 0XX),并检测该字节的第八位(R/W)。对于10位地址设备R/W=1,对于7位地址设备,地址(1111 0XX)不匹配,因此这些设备都不会响应Sr,不会被寻址。


    图4.6 主接收器寻址从发送器(十位地址空间)

3.保留地址

I2C系统保留地址如图4.7所示:


图4.7 I2C保留地址

4.通用广播地址

通用广播地址是为了寻址总线上所有设备。如果一个设备不需要使用广播功能,可以不响应广播。如果设备需要使用广播功能,则它在检测到广播地址后发送响应,并作为从接收器读取总线上发送的数据。主机不知道总线上有多少从机发送响应。总线上所有可以响应广播的从机读取广播地址后的第二个及后面的字节。不能处理这些广播数据的从机通过不发送响应的方式忽略它。同样地,如果有一个或一个以上的从机发送响应,则主机就检测不到总线上其它没有响应的设备。广播消息的含义总是定义在第二个字节(图4.8)。


图4.8 广播消息格式

有两种可能情况:

  • 最低位“B”为0

  • 最低位“B”为1
    “B”为0,第二个字节包括以下定义:

  • 0000 0110(06h):复位并通过硬件写内容到从机的可编程部分。所有可以响应此类广播的从机,收到此两字节后,进行复位并进入它们地址的可编程部分。注意确保设备在加电后不会将SDA或SCL拉低,因为这些低电平会阻塞总线;

  • 0000 0100(04h):通过硬件写内容到从机的可编程部分,作用类似(06h),但设备不会复位;

  • 0000 0000(00h):这个不应该作为第二个字节用。
    编程时序参考相应设备的DATASHEET。

“B”为1,两字节广播定义为“硬件广播”。主机(如键盘扫描器)在编程后,可以发送既定的从机地址到总线上,构成两字节序列的“硬件广播”。既然主机可能并不知道总线上从机的地址,它只能通过硬件广播的方式,将自身地址通知给系统。如图4.9所示:

图4.9

硬件广播的第二个字节的前七位包括主机的地址。总线上的智能设备如微控制器,读取此地址并接收主机发送的其它信息。如果主机也可以作为从机使用,则以上读取的主机地址实际上也就是(切换主从模式后的)从机地址。

在系统中,一种可能是系统复位后设备由主机发送模式切换到从机接收模式,这时由系统主机先告诉硬件主机数据应送往的从机地址,这样当硬件主机发送数据时就可以直接向指定从机(地址)发送数据了。

五、其他说明

1.软件复位

通用广播地址0000 0000后发送0000 0110(06h)可以使总线上设备进入复位过程。该功能是可选的,所有预留该功能的设备在收到该两字节序列(00 06h)后,开始响应(复位),并进入它们地址的可编程部分。注意确保设备在加电后不会将SDA或SCL拉低,因为这些低电平会阻塞总线。

2.START字节

起始字节是提供给没有I2C总线接口的单片机查询I2C总线时使用的特殊字节。

不具备I2C总线接口的单片机,必须通过软件不断地检测总线,以便及时响应总线请求。单片机的速度与硬件接口器件的速度可能存在较大的差别。为此,I2C上的数据传送需要一个较长的起始过程加以引导。引导过程由起始信号、起始字节、应答位、重复起始信号(Sr)组成。


图5.1 起始字节

请求访问总线的主机发出开始条件(S)后,紧接着发送起始字节 0000 0001,总线上的单片机可以用比较低的速率采样SDA线,直到检测到起始字节中的7个“0”中的一个为止。在检测到SDA上的高电平后,单片机可以切换到较高的采样速率,采样作为同步信号使用的第二个起始信号Sr。

在起始信号后的应答时钟脉冲仅仅是为了和总线所使用的格式一致,并不要求设备在这个脉冲期间作应答。

3.Bus Clear

SCL:一般情况下,SCL不会拥堵(stuck)在低电平,出现这种情况的话,如果设备包含硬件复位引脚,推荐使用硬件复位。如果设备没有硬件复位引脚,可以通过重新上电方式触发设备内部上电复位电路(Power-On Reset Circuit)

SDA:如果SDA拥堵在低电平,主机应发送9个时钟脉冲,那些将SDA拉低的设备在这9个时钟周期内应释放总线。如果没有的话,则需要通过硬件复位或重新上电的方式清除拥堵。

4.设备号

设备号由三个字节(24bit)组成,包括以下信息:

  • 12位厂商编号,每个厂商具有唯一的编号(如NXP);
  • 9位设备编号,由厂商自定义(如PCA9698);
  • 3位版本号,由厂商自定义(如RevX)


    图5.2 设备号编码规则

5.电平转换

参考NXP应用手册:AN10441 Level Shifting Techniques in I2C-bus Design,也可以用专用的I2C电平转换芯片。相比于图5.3分立电路方案,芯片方案实现支持的速率更高,且不存在漏电等问题。

图5.3 分立电路实现的I2C双向电平转换

六、一些补充

1.对ACK信号的处理

  • SCL一直由Master控制,SDA依照数据传送的方向,读数据时由Slave控制SDA,写数据时由 Master控制SDA。当8位数据传送完毕之后,应答位或者否应答位的SDA控制权与数据位传送时相反。
  • 开始位“Start”和停止位“Stop”,只能由Master来发出。
  • 地址的8位传送完毕后,成功配置地址的Slave设备必须发送“ACK”。否则否则一定时间之后Master视为超时,将放弃数据传送,发送“Stop”。
  • 当写数据的时候,Master每发送完8个数据位,Slave设备如果还有空间接受下一个字节应该回答“ACK”,Slave设备如果没有空间接受更多的字节应该回答“NACK”,Master当收到“NACK”或者一定时间之后没收到任何数据将视为超时,此时Master放弃数据传送,发送“Stop”。
  • 当读数据的时候,Slave设备每发送完8个数据位,如果Master希望继续读下一个字节,Master应该回答“ACK”以提示Slave准备下一个数据,如果Master不希望读取更多字节,Master应该回答“NACK”以提示Slave设备准备接收Stop信号。

在实际应用中,并没有强制规定数据接收方必须对于发送的8位数据做出回应,尤其是在Master和Slave端都是用GPIO软件模拟的方法来实现的情况下,编程者可以事先约定数据传送的长度,slave不检查NACK,有时可以起到减少系统开销的效果。但是如果Slave方是硬件I2C要求一定要标准的NACK,master方是GPIO软件模拟I2C并没有正确的发送NACK,就会出现“slave收不到stop”导致I2C挂死。

2.I2C从机挂死分析与解决方法

参考自
http://news.eeworld.com.cn/mcu/2019/ic-news040843702.html

I2C总线使用“线与”结构实现多主机仲裁与同步,因为这个特性,只要总线上任何一个器件拉低了SDA或者SCL,其他器件都无法拉高它们,看到的都是低电平。如果有器件不释放总线,则整个总线上的通讯都会被暂停,我们成为I2C bus hangs:I2C总线挂死。

因为I2C主机一般是可编程的器件,受我们控制,如果主机主动拉低了总线,我们可以通过调试代码了解原因,也可以很方便的通过复位I2C外设或者复位芯片来退出这种状态。而I2C从机往往不带RESET引脚,如果挂死了总线即使整个系统复位都无法解除,仅重新上下电才可以恢复。很多系统上是不可接受的,因此我们需要更加小心的处理I2C从机挂死的情况,下面分析也是针对I2C从机挂死来写的。

SDA挂死

先来看下哪些情况下I2C从机会需要拉低SDA线。
主机向从机写数据或地址时,从机如果发出ACK应答,则会第9个CLK的期间拉低SDA
主机读数据的时候,从机会在bit为0时对应的CLK期间拉低SDA
那什么情况I2C从机又可能钳住SDA线呢?

I2C协议SCL为高的时候,SDA电平应保持,而等到SCL为低后(也就是下降沿后)才能发生改变。如果在上面几个CLK的前半个周期SCL拉高后主机不再拉低呢?从机会有什么动作?YES,从机会持续拉低着SDA,直到见到下一个他应该输出高电平的下降沿。

最常见的情况就是主机在通讯的过程中产生了复位。由于复位动作通常会立刻执行,外设状态机都恢复到默认状态,也就发不出完整的CLK了。那么等到主机复位完成回来后,SCL为高,SDA被从机拉低。主机无法发起START起始条件,不能开始下一次与从机的通讯,这称为SDA挂死。

最常用的解决办法就是主机每次复位后,先发送连续9个CLK,使从机释放总线。也可以根据参考文献的做法进行更复杂的判断,释放时间可以更少。

SCL挂死

I2C从机主动拉低SCL线在规范中是一个合法的行为,称之为Clock Stretching(时钟扩展,我一般叫他时钟同步)。通常是主机请求数据( 收或者发)后从机需要一些时间处理,且没有多余Buffer可以接收接或者提供接下来的数据的时候从机则会拉低SCL一段时间直到有新的数据准备好。

SCL挂死(也就是前面所说一直拉低SCL)这种情况在标准I2C从器件上基本不会出现,因为只要芯片还在正常工作buffer总算有准备好的时候,自然就就释放SCL了。往往是使用用户使用MCU作为I2C从机时,程序设计上的问题导致MCU无法读取&填充buffer而导致,重点分析MCU I2C中断服务程序。

  • I2C中断服务程序被意外屏蔽
  • 中断服务程序中陷入了一些标志位查询的while(flag != xxx)死循环
  • I2C功能系统被意外禁止
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,794评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,050评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,587评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,861评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,901评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,898评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,832评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,617评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,077评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,349评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,483评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,199评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,824评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,442评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,632评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,474评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,393评论 2 352

推荐阅读更多精彩内容