当前位置:文档之家› DSP2808中i2c实例分析

DSP2808中i2c实例分析

DSP2808中i2c实例分析
DSP2808中i2c实例分析

注意:本例分析基于DSP2808中的i2c_eeprom示例程序和AT24C1024 EEPROM存储器。当然,在学IIC之前要了解一下IIC工作流程,知道AT24C1024存储芯片的使用方法。

现在按以下4部分来介绍这个示例。

1.示例程序中几种状态说明

第一次看i2c_eeprom示例程序,对程序中的MsgStatus信息状态切换非常懵懂,为什么要有这几个状态?状态切换顺序如何安排?一大堆的状态,让人有些摸不着头脑。先把程

序中的头文件涉及的7种状态分析一下。

// I2C Message Commands for I2CMSG struct

#define I2C_MSGSTAT_INACTIVE 0x0000 //未激活状态:一般成功发送数据或者//接受数据后可以设置信息状态为此状态,告诉用户可进行下一次的写数据或读数据。

#define I2C_MSGSTAT_SEND_WITHSTOP 0x0010 //发送带停止位数据:这是为写数据而设///的状态,写入地址和数据之后发个停止位告诉存储器数据写入完毕。

#define I2C_MSGSTAT_WRITE_BUSY 0x0011 //写数据忙状态:在将待写的数据放入//缓存后,就可以使能IIC传输数据了,然后把信息状态设为该状态,意在告诉用户:数据//已经在传送过程中。当然是否传送完毕,还需要通过查询SCD位来判断。

#define I2C_MSGSTAT_SEND_NOSTOP 0x0020//发送无停止位数据:这个状态是为了读//取数据而设的,有查阅过AT24C1024EEPROM存储器使用手册的读者知道,在读数据之前//要发送数据的地址,发完地址不能产生停止位,这是存储器硬件设计决定的。设为这个状//态意在告诉读者,可以发送要读取的数据的地址了。

#define I2C_MSGSTAT_SEND_NOSTOP_BUSY 0x0021//发送无停止位数据忙状态:这个状态是//为了读取数据而设的,似于I2C_MSGSTAT_WRITE_BUSY,说明地址数据已经在传送过程中。//传送是否成功,还要看ARDY的状态。

#define I2C_MSGSTAT_RESTART 0x0022//重发开始位状态:这个状态也是为读取////数据而设。我们知道,读取存储器数据主要分两个步骤:第一,发送START位+设备地址//+数据地址+无停止位。第二,再发START位+设备地址,紧接着存储器发送数据到IIC接收//缓存器(I2CDRR),接收到设定好的数据数量(I2CCNT值)时输出停止位STOP.

//值得注意的是:理论上写完数据就能马上读取数据,但事实上EEPROM存储器仍需要一////定延时来存储数据,约有2ms左右。通过示波器可以观察到,写完数据后,并不能马上//成功读取数据,也就是说读数据的第一步骤要重复好几次(总线为50K时,大约要重复//8次)才能成功。

#define I2C_MSGSTAT_READ_BUSY 0x0023//读取数据忙状态:这个状态是为读取数//据而设。在读数据的第二步骤中,发完START位+设备地址后,就设为这一状态。意在说//明IIC开始等待接收固定数量(I2CCNT值)的数据。可以通过查询ARDY位判断。

//头文件中的其他定义应该没什么大问题了!

2.AT24C1024 EEPROM读写数据格式

(2)单字节写入:START -> 发送从设备地址(写控制码R/W=0) -> 处理Ack -> 发送字节地址 -> 处理Ack [-> 发送1字节数据 -> 处理Ack] -> STOP。如下图:

(3)按页写入: START -> 发送从设备地址(写控制码R/W=0) -> 处理Ack -> 发送字节地址 -> 处理Ack [-> 发送1字节数据 -> 处理Ack-> 发送第2字节数据 -> 处理Ack-> 发送第3字节数据 -> 处理Ack……直到发完X字节] -> STOP。如下图。注意,连续写入的数据字节数不能超过每页所能容下的总量。如果写入的数据超过一页的长度,将发生回卷,即从EEPROM的0地址处进行数据覆盖。比如,AT24C1024有512页,每页最大容纳256字节。超过这个长度,地址指针将从每页首地址重新开始。

(4)随机单字节读取:第一步:发START -> 发送从设备地址(写控制码R/W=0) -> 处理Ack -> 发送字节地址高位 -> 处理Ack -> 发送字节地址低位 -> 处理Ack -> 第二步:发START -> 发送器件地址(读控制码R/W=1) -> 处理Ack -> 接收1字节数据 -> STOP。

(5)随机连续读取:在随机单字节读取操作的STOP信号发送之前,加入若干个[-> 发送Ack -> 接收1字节数据] 即可实现。

(6)当前位置单字节读取:START -> 发送从设备地址(读控制码) -> 处理Ack -> 发送字节地址 -> 处理Ack -> 接收1字节数据 -> STOP。当前指的是之前进行过读取操作但是没有发送STOP信号,EEPROM芯片内部指针所在的位置即为当前位置。

(7)当前位置连续读取:在当前位置单节读取操作的STOP信号发送之前,加入若干个 [-> 发送Ack -> 接收1字节数据] 即可实现。

备注:部分内容引用百度文库中的《I2C读写流程》文档

3.主程序说明及流程图

详细的注释可以参见程序附录,,这里主要解释一下设备地址取0x50的缘由。从

AT24C1024的数据手册可知,设备地址为。而在程序中设置的地址是0x50,即0B0101 0000。看似不妥,其实,这个例子中设备地址采用7位地址模式,这样只取0x50的低7位作为设备地址的高七位,设备地址的最低位R/W则由寄存器

I2CMDR中的TRX位决定。这样读数据时设备地址为0B1010 0001,写数据时设备地址改为

0B1010 0000。通过示波器可以验证这些数据。

问题1:每次检测到SCD中断时,也就是顺利发完指定数量的数据或者接收指定数量的数据了,理论上I2caRegs.I2CCNT==0,但是本人设了几个中断点去观察该寄存器的值,发现总是不为零。通过观察I2caRegs.I2CFFTX.bit.TXFFST和I2caRegs.I2CFFRX.bit.RXFFST,可以发现这两个寄存器为零时,I2caRegs.I2CCNT也不为零。由此可知,I2CCNT不能实时反映发送/接收存储器中数据的数量,不过可以用TXFFST/RXFFST来代替。

图1 主程序流程图,图2为写数据程序流程图,图3为读数据程序流程图,图4为中断函数流程图。

图2写数据程序流程图图3读数据程序流程图

4.程序附录

//可以用以下代码替换示例程序Example_280xI2c_eeprom.c中的代码,再进行调试。// //该程序跟原始程序没多大区别,主要改变为:引入几个统计变量,改变发送数据长度为2字节// // TI File $Revision: /main/5 $

// Checkin $Date: April 4, 2007 17:18:36 $

//###########################################################################

//

// FILE: Example_280xI2c_eeprom.c

//

// TITLE: DSP280x I2C EEPROM Example

//

// ASSUMPTIONS:

//

// This program requires the DSP280x header files.

//

// This program requires an external I2C EEPROM connected to

// the I2C bus at address 0x50.

//

// As supplied, this project is configured for "boot to SARAM"

// operation. The 280x Boot Mode table is shown below.

// For information on configuring the boot mode of an eZdsp,

// please refer to the documentation included with the eZdsp,

//

// Boot GPIO18 GPIO29 GPIO34

// Mode SPICLKA SCITXDA

// SCITXB

// -------------------------------------

// Flash 1 1 1

// SCI-A 1 1 0

// SPI-A 1 0 1

// I2C-A 1 0 0

// ECAN-A 0 1 1

// SARAM 0 1 0 <- "boot to SARAM"

// OTP 0 0 1

// I/0 0 0 0

//

// DESCRIPTION:

//

// This program will write 1-14 words to EEPROM and read them back.

// The data written and the EEPROM address written to are contained

// in the message structure, I2cMsgOut1. The data read back will be

// contained in the message structure I2cMsgIn1.

// --------------------------------------------------------------

// CODE MODIFICATIONS ARE REQUIRED FOR 60 MHZ DEVICES (In

// DSP280x_Examples.h in the common/include/ directory, set

// #define CPU_FRQ_60MHZ to 1, and #define CPU_FRQ_100MHZ to 0).

// --------------------------------------------------------------

// This program will work with the on-board I2C EEPROM supplied on

// the F280x eZdsp.

//

//

//###########################################################################

// Original Author: D.F.

//

// $TI Release: DSP280x Header Files V1.60 $

// $Release Date: December 3, 2007 $

//###########################################################################

#include "DSP280x_Device.h" // DSP280x Headerfile Include File

#include "DSP280x_Examples.h" // DSP280x Examples Include File

// Note: I2C Macros used in this example can be found in the

// DSP280x_I2C_defines.h file

// Prototype statements for functions found within this file.

void I2CA_Init(void);

Uint16 I2CA_WriteData(struct I2CMSG *msg);

Uint16 I2CA_ReadData(struct I2CMSG *msg);

interrupt void i2c_int1a_isr(void);

void pass(void);

void fail(void);

#define I2C_SLAVE_ADDR 0x50 //EEPROM地址

#define I2C_NUMBYTES 2 //为方便示波器观察,设置发送2字节的数据

#define I2C_EEPROM_HIGH_ADDR 0x11 //数据的写入地址高位

#define I2C_EEPROM_LOW_ADDR 0x0F //数据的写入地址低位

// Global variables//全局变量

// Two bytes will be used for the outgoing address,//有2个字节是地址

// thus only setup 14 bytes maximum//最多只能设置14字节数据

struct I2CMSG I2cMsgOut1={I2C_MSGSTAT_SEND_WITHSTOP,//初始状态为:发送带停止位数据

I2C_SLAVE_ADDR,

I2C_NUMBYTES,

I2C_EEPROM_HIGH_ADDR,

I2C_EEPROM_LOW_ADDR,

0xff, // Msg Byte 01

0x3F, // Msg Byte 02

0x56, // Msg Byte 03

0x78, // Msg Byte 04

0x9A, // Msg Byte 05

0xBC, // Msg Byte 06

0xDE, // Msg Byte 07

0xF0, // Msg Byte 08

0x11, // Msg Byte 09

0x10, // Msg Byte 10

0x11, // Msg Byte 11

0x12, // Msg Byte 12

0x13, // Msg Byte 13

0x12, // Msg Byte 14

};

struct I2CMSG I2cMsgIn1={ I2C_MSGSTAT_SEND_NOSTOP,

I2C_SLAVE_ADDR,

I2C_NUMBYTES,

I2C_EEPROM_HIGH_ADDR,

I2C_EEPROM_LOW_ADDR};

struct I2CMSG *CurrentMsgPtr; // Used in interrupts

Uint16 PassCount;

Uint16 FailCount;

Uint16 ARDY_ISRC_NACK_number=0; //统计ARDY中断源引起的中断中NACK次数Uint16 SCD_ISRC_number=0; //统计SCD中断源引起的中断次数

Uint16 ARDY_ISRC_number=0; //统计ARDY中断源引起的中断次数

Uint16 all_ISRC_number=0; //统计所有中断源引起的中断次数

Uint16 Write_load_num=0; //统计写数据函数调用次数

Uint16 Read_load_num1=0; //统计读数据函数调用次数1第一步骤

Uint16 Read_load_num2=0; //统计读数据函数调用次数2第二步骤

void main(void)

{

Uint16 Error;

Uint16 i;

CurrentMsgPtr = &I2cMsgOut1;

// Step 1. Initialize System Control:

// PLL, WatchDog, enable Peripheral Clocks

// This example function is found in the DSP280x_SysCtrl.c file.

InitSysCtrl();

// Step 2. Initalize GPIO:

// This example function is found in the DSP280x_Gpio.c file and

// illustrates how to set the GPIO to it's default state.

// InitGpio();

// Setup only the GP I/O only for I2C functionality

InitI2CGpio();

// Step 3. Clear all interrupts and initialize PIE vector table:

// Disable CPU interrupts

DINT;

// Initialize PIE control registers to their default state.

// The default state is all PIE interrupts disabled and flags

// are cleared.

// This function is found in the DSP280x_PieCtrl.c file.

InitPieCtrl();

// Disable CPU interrupts and clear all CPU interrupt flags:

IER = 0x0000;

IFR = 0x0000;

// Initialize the PIE vector table with pointers to the shell Interrupt

// Service Routines (ISR).

// This will populate the entire table, even if the interrupt

// is not used in this example. This is useful for debug purposes.

// The shell ISR routines are found in DSP280x_DefaultIsr.c.

// This function is found in DSP280x_PieVect.c.

InitPieVectTable();

// Interrupts that are used in this example are re-mapped to

// ISR functions found within this file.

EALLOW; // This is needed to write to EALLOW protected registers PieVectTable.I2CINT1A = &i2c_int1a_isr;

EDIS; // This is needed to disable write to EALLOW protected registers

// Step 4. Initialize all the Device Peripherals:

// This function is found in DSP280x_InitPeripherals.c

// InitPeripherals(); // Not required for this example

I2CA_Init();

// Step 5. User specific code

// Clear Counters

PassCount = 0;

FailCount = 0;

// Clear incoming message buffer

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

{

I2cMsgIn1.MsgBuffer[i] = 0x0000;

}

// Enable interrupts required for this example

// Enable I2C interrupt 1 in the PIE: Group 8 interrupt 1

PieCtrlRegs.PIEIER8.bit.INTx1 = 1;

// Enable CPU INT8 which is connected to PIE group 8

IER |= M_INT8;

EINT;

// Application loop

for(;;)

{

//////////////////////////////////

// Write data to EEPROM section //

//////////////////////////////////

// Check the outgoing message to see if it should be sent.

// In this example it is initialized to send with a stop bit.

if(I2cMsgOut1.MsgStatus == I2C_MSGSTAT_SEND_WITHSTOP)

{ Write_load_num++;

Error = I2CA_WriteData(&I2cMsgOut1);

// If communication is correctly initiated, set msg status to busy//如果通信已经正确初始化,设置msg状态为’忙‘,并

// and update CurrentMsgPtr for the interrupt service routine. //更新作为中断服务路径的指针CurrentMsgPtr。

// Otherwise, do nothing and try again next loop. Once message is //否则,不做任何操作,等待下一次重新写数据。一旦信息正确// initiated, the I2C interrupts will handle the rest. Search for //初始化,I2C中断将处理接下来的事情。可以在

// ICINTR1A_ISR in the i2c_eeprom_isr.c file. //i2c_eeprom_isr.c文件中找到ICINTR1A_ISR。

if (Error == I2C_SUCCESS) //数据已成功放入缓存寄存器

{

CurrentMsgPtr = &I2cMsgOut1; //改变指针路径

I2cMsgOut1.MsgStatus = I2C_MSGSTAT_WRITE_BUSY; //设为发送数据忙状态

}

} // end of write section

///////////////////////////////////

// Read data from EEPROM section //该过程包括两次发送START位,第一次发送地址

///////////////////////////////////

// Check outgoing message status. Bypass read section if status is

// not inactive.

if (I2cMsgOut1.MsgStatus == I2C_MSGSTAT_INACTIVE)

{

// Check incoming message status.

if(I2cMsgIn1.MsgStatus == I2C_MSGSTAT_SEND_NOSTOP)

{ Read_load_num1++;

// EEPROM address setup portion

while(I2CA_ReadData(&I2cMsgIn1) != I2C_SUCCESS)

{

// Maybe setup an attempt counter to break an infinite while //这里可以设置一个计数器用于终止可能存在的无限循环。

// loop. The EEPROM will send back a NACK while it is performing//当EEPROM忙于处理写数据操作时,将返回一个NACK。

// a write operation. Even though the write communique is //对DSP来说,此刻写操作已经完成。但是,EEPROM仍需要

// complete at this point, the EEPROM could still be busy //一定时间完成数据的烧写1.8ms左右。在EEPROM完成烧写之前,都会// programming the data. Therefore, multiple attempts are //返回NACK,告诉DSP它还在忙。因此,DSP需要多次尝试,直到// necessary. //EEPROM空闲了,并返回ACK确认为止。

}

// Update current message pointer and message status

CurrentMsgPtr = &I2cMsgIn1;

I2cMsgIn1.MsgStatus = I2C_MSGSTAT_SEND_NOSTOP_BUSY;

//第一次发送START成功,即地址数据已发送成功,给发无停止位数据忙状态,作为第二次发送START位标志

}

// Once message has progressed past setting up the internal address//一旦成功写入EEPROM地址,便可以再次发送START起始位// of the EEPROM, send a restart to read the data bytes from the //然后从EEPROM存储器中读取数据。

// EEPROM. Complete the communique with a stop bit. MsgStatus is //DSP采可用一个停止位来结束数据接收。

// updated in the interrupt service routine. //msg状态在中断程序中被更新了。

else if(I2cMsgIn1.MsgStatus == I2C_MSGSTAT_RESTART) //该状态是在中断服务程序中态被赋予

{ Read_load_num2++;

// Read data portion

while(I2CA_ReadData(&I2cMsgIn1) != I2C_SUCCESS)

{

// Maybe setup an attempt counter to break an infinite while

// loop.

}

// Update current message pointer and message status

CurrentMsgPtr = &I2cMsgIn1;

I2cMsgIn1.MsgStatus = I2C_MSGSTAT_READ_BUSY;

//第二次发送START,且数据接收成功,给下一个状态-读忙,作为中断中读取接收缓存中数据的标志

}

} // end of read section

} // end of for(;;)

} // end of main

void I2CA_Init(void)

{

// Initialize I2C

I2caRegs.I2CSAR = 0x0050; // Slave address - EEPROM control code

#if (CPU_FRQ_100MHZ)

I2caRegs.I2CPSC.all = 9; // Prescaler - need 7-12 Mhz on module clk

#endif

#if (CPU_FRQ_60MHZ)

I2caRegs.I2CPSC.all = 6; // Prescaler - need 7-12 Mhz on module clk

#endif

I2caRegs.I2CCLKL = 95; // NOTE: must be non zero

I2caRegs.I2CCLKH = 95; // NOTE: must be non zero

I2caRegs.I2CIER.all = 0x24; // Enable SCD & ARDY interrupts

I2caRegs.I2CMDR.all = 0x0020; // Take I2C out of reset

// Stop I2C when suspended

//0b0000 0000 0010 0000,NACKMOD=0,FREE=0中断产生时IIC停止运行,STT=0不产生开始位,

//STP=0不产生停止位,MST=0从模式,TRX=0接收模式,XA=0 七位地址模式,RM=0不重复,DLB=0无回来

//IRS=1使能I2C模块,STB=0模块未处在开始字节模式,FDF=0自由数据格式被禁止

//注意:TRX决定AT24C1024设备地址中的R/W,这里R/W=1读数据I2caRegs.I2CFFTX.all = 0x6000; // Enable FIFO mode and TXFIFO

I2caRegs.I2CFFRX.all = 0x2040; // Enable RXFIFO, clear RXFFINT,

return;

}

Uint16 I2CA_WriteData(struct I2CMSG *msg)

{

Uint16 i;

// Wait until the STP bit is cleared from any previous master communication.

// Clearing of this bit by the module is delayed until after the SCD bit is

// set. If this bit is not checked prior to initiating a new message, the

// I2C could get confused.

if (I2caRegs.I2CMDR.bit.STP == 1)

{

return I2C_STP_NOT_READY_ERROR;

}

// Setup slave address

I2caRegs.I2CSAR = msg->SlaveAddress;

// Check if bus busy

if (I2caRegs.I2CSTR.bit.BB == 1)

{

return I2C_BUS_BUSY_ERROR;

}

////////判断总线空闲后进行数据发送////////

// Setup number of bytes to send

// MsgBuffer + Address

I2caRegs.I2CCNT = msg->NumOfBytes+2; //递减

// Setup data to send

I2caRegs.I2CDXR = msg->MemoryHighAddr;

I2caRegs.I2CDXR = msg->MemoryLowAddr;

// for (i=0; iNumOfBytes-2; i++)

for (i=0; iNumOfBytes; i++)

{

I2caRegs.I2CDXR = *(msg->MsgBuffer+i);

}

// Send start as master transmitter

I2caRegs.I2CMDR.all = 0x6E20; // 按以下参数配置IIC并使能IIC

//【0b0110 1110 0010 0000,NACKMOD=0,FREE=1中断产生时IIC能继续运行,STT=1产生开始位】

//【STP=1产生停止位,MST=1主模式,TRX=1发送,XA=0 七位地址模式,RM=0不重复,DLB=0无回路,IRS=1使能I2C模块,STB=0,FDF=0】//开始发送数据,I2CCNT 递减模式统计数据到达0时产生中断,且产生停止位

//注意:TRX决定AT24C1024设备地址中的R/W,这里R/W=0写数据模式

return I2C_SUCCESS;

}

Uint16 I2CA_ReadData(struct I2CMSG *msg)

{ //要完成一次读数据任务:要产生两个START位,产生第1个START位之后发送设备地址和数据地址;

//产生第2个START位之后写入设备地址,并开始接收存储器提供的数据。

// Wait until the STP bit is cleared from any previous master communication.

// Clearing of this bit by the module is delayed until after the SCD bit is

// set. If this bit is not checked prior to initiating a new message, the

// I2C could get confused.

if (I2caRegs.I2CMDR.bit.STP == 1)

{

return I2C_STP_NOT_READY_ERROR;

}

I2caRegs.I2CSAR = msg->SlaveAddress;

if(msg->MsgStatus == I2C_MSGSTAT_SEND_NOSTOP) //产生第一个START位之后发送设备地址和数据地址////

{

// Check if bus busy

if (I2caRegs.I2CSTR.bit.BB == 1)

{

return I2C_BUS_BUSY_ERROR;

}

I2caRegs.I2CCNT = 2; // 设置发送数据字节数-递减模式-等0时可以允许产生stop位(若使能STP)

I2caRegs.I2CDXR = msg->MemoryHighAddr;//发送要读取数据的开始地址

I2caRegs.I2CDXR = (msg->MemoryLowAddr);

I2caRegs.I2CMDR.all = 0x2620; // 按以下参数配置IIC并使能IIC

//【STT =1发送起始位,STP=0不产生停止位,MST=1主模式,TRX=1发送,IRS=1使能I2C模块】} // 开始发送数据I2CCNT 递减模式统计数据到达0时产生中断,但是没有产生停止位

//注意:TRX决定AT24C1024设备地址中的R/W,这里R/W=0写数据

else if(msg->MsgStatus == I2C_MSGSTAT_RESTART)//产生第2个START位之后发送设备地址,然后开始接收存储器提供的数据//

{

I2caRegs.I2CCNT = msg->NumOfBytes; // 设置数据接收字节数量

I2caRegs.I2CMDR.all = 0x2C20; // 按以下参数配置IIC并使能IIC

// 【STT =1发送起始位,STP=1产生停止位,MST=1主模式,TRX=0接收,IRS=1使能I2C模块】} //开始接收数据,I2CCNT递减模式统计数据到达0时产生中断,有产生停止位

//注意-TRX决定AT24C1024设备地址中的R/W,这里R/W=1读数据

return I2C_SUCCESS; //到此说明发送地址/读取数据成功

}

interrupt void i2c_int1a_isr(void) // I2C-A

{

Uint16 IntSource, i;

all_ISRC_number++;//统计所有中断次数

// Read interrupt source

IntSource = I2caRegs.I2CISRC.all;

// Interrupt source = stop condition detected

if(IntSource == I2C_SCD_ISRC)

{

SCD_ISRC_number++;

// If completed message was writing data, reset msg to inactive state

if (CurrentMsgPtr->MsgStatus == I2C_MSGSTAT_WRITE_BUSY)

{

CurrentMsgPtr->MsgStatus = I2C_MSGSTAT_INACTIVE;//发送完成,便换为未启动状态;说明可以进行下一次写数据

}

else

{

// If a message receives a NACK during the address setup portion of the

// EEPROM read, the code further below included in the register access ready

// interrupt source code will generate a stop condition. After the stop

// condition is received (here), set the message status to try again.

// User may want to limit the number of retries before generating an error.

if(CurrentMsgPtr->MsgStatus == I2C_MSGSTAT_SEND_NOSTOP_BUSY)//发送无停止位地址忙

{

CurrentMsgPtr->MsgStatus = I2C_MSGSTAT_SEND_NOSTOP;//更新为发送停止位状态,可允许下一发送地址}

// If completed message was reading EEPROM data, reset msg to inactive state

// and read data from FIFO.

else if (CurrentMsgPtr->MsgStatus == I2C_MSGSTAT_READ_BUSY) //读数据忙状态,说明可对接收缓存器I2CDRR进行接收数据读取了{

CurrentMsgPtr->MsgStatus = I2C_MSGSTAT_INACTIVE; //设为未启状态动,再读数据,这样允许下一次写数据到EEPROM for(i=0; i < I2C_NUMBYTES; i++)

{

CurrentMsgPtr->MsgBuffer[i] = I2caRegs.I2CDRR;

}

// Check recieved data //读完接收到的数据,接下来进行判断数据是否准确

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

{

if(I2cMsgIn1.MsgBuffer[i] == I2cMsgOut1.MsgBuffer[i])

{

PassCount++;

}

else

{

FailCount++;

}

}

if(PassCount == I2C_NUMBYTES)

{

pass();

}

else

{

fail();

}

//检查完毕

}

}

} // end of stop condition detected

// Interrupt source = Register Access Ready

// This interrupt is used to determine when the EEPROM address setup portion of the

//该中断用于判断读数据通讯中何时完成EEPROM数据地址的设置;

// read data communication is complete. Since no stop bit is commanded, this flag

//由于不产生停止位,这个标志(ARDY)告诉我们地址数据是否发送完成。

// tells us when the message has been sent instead of the SCD flag. If a NACK is

//如果收到NACK,清除NACK位,并设置产生一个停止位。

// received, clear the NACK bit and command a stop. Otherwise, move on to the read

//否则,继续读取通讯数据。

// data portion of the communication. else if(IntSource == I2C_ARDY_ISRC) //IIC模块准备好中断:包括【复位,发完一个数据单元(1~8bits的数据)

{ //却没收到ACK/STOP或者出现counter=0】都可引发该中断

ARDY_ISRC_number++;

if(I2caRegs.I2CSTR.bit.NACK == 1) //因为EEPROM处理数据忙而回复的NACK

{

I2caRegs.I2CMDR.bit.STP = 1; //产生一个STOP停止位,从而引发一次SCD中断。

I2caRegs.I2CSTR.all = I2C_CLR_NACK_BIT; //清除NACK位

ARDY_ISRC_NACK_number++;

}

else if(CurrentMsgPtr->MsgStatus == I2C_MSGSTAT_SEND_NOSTOP_BUSY)

{

CurrentMsgPtr->MsgStatus = I2C_MSGSTAT_RESTART;//更新为重发START位状态,为接收数据准备

}

} // end of register access ready

else

{

// Generate some error due to invalid interrupt source

asm(" ESTOP0");

}

// Enable future I2C (PIE Group 8) interrupts

PieCtrlRegs.PIEACK.all = PIEACK_GROUP8; //重启中断允许

}

void pass()

{

asm(" ESTOP0");

for(;;);

}

void fail()

{

asm(" ESTOP0");

for(;;);

}

//=========================================================================== // No more.

//===========================================================================

述职报告与工作总结的区别,述职报告与工作总结有什么不同

述职报告与工作总结的区别,述职报告与工作总结有什么不同 各位读友大家好,此文档由网络收集而来,欢迎您下载,谢谢 我们在工作时有很多情况下需要写述职报告和工作总结,但是两者是有区别的,注意不要混淆,以下是为大家搜集整理的述职报告与总结的区别,欢迎阅读! 什么是述职报告 述职报告是指各级各类机关工作人员,主要是领导干部向上级、主管部门和下属群众陈述任职情况,包括履行岗位职责,完成工作任务的成绩、缺点问题、设想,进行自我回顾、评估、鉴定的书面报告。 述职报告怎么写 述职报告是大型企业、规范企业进行个人年度总结的一种形式。一般是针

对个人一年的岗位职责执行情况、个人指标完成情况进行总结性答复。 述职报告的写作方式一般为2种: 一是四大段式,即做法+成绩+不足+改进。 二是逐条答复式。每条职责需逐个回答:做法+效果+问题+改进。 采取哪种方式根据人力资源部门或上级的要求进行。 写好述职报告要把握五个要点: 一、写出信心。 不管你的工作情况如何,写述职报告时一定要写出你的信心。干好了,总结经验;干得不好,找出问题,分析原因,制定切实可行的对策,树立来年能做好此项工作的信心。 一般领导都是向前看的。你干得不好,交了学费,知道了不足,来年会改进。若换了新人,没准还要交更多的学费。 这里关键是看你的态度和信心。今年没干好,你对自己都没信心,灰头丧

气,别人怎能会对你有信心? 不怕有缺点,就怕没自信。 二、写出成绩。 可不是“成绩不说没不了,问题不着不得了”,成绩不说也不得了,现在都实行层次管理,况且人力资源部门对你不会有太多了解,成绩一定要写足,这也是培养自信心的好办法。 写成绩时切忌两大“戒”,一戒“吹”。让人感觉你有一点在吹,不实事求是,对你的好印象立即减少50%,搞不好会归入“另类”。二戒“傲”。只谈个人的努力,大谈自己的本领,不讲领导和同事的帮助,不讲客观上遇到好的机遇,自信心过强,叫自大了。这样也会进入“骄傲”、“不合群”、“不成熟”的另类。 三、写出特点。 一定要发现你的优势与特点,即你与众不同的地方在工作中的具体体现。不论是写文章,还是在做事时就要发挥自己的独特优势,发现时间的特殊规律,采取与众不同的做法作出成绩来。

实验八 IIC通信协议

实验八I2C通信协议 一、实验目的: 1、培养学生阅读资料的能力; 2、加深学生对I2C总线通信协议的理解; 3、加强学生对模块化编程的理解; 二、实验环境: 1、硬件环境:PC机一台、单片机实验板一块、母头串口交叉线、USB电源线; 2、软件环境:keil uVision2集成开发环境; STC-ISP下载上位机软件; 三、实验原理: 要学会I2C通信协议的编程,关键是要看懂并掌握其时序图,理解对I2C通信协议相关子程序的实验编写。I2C通信协议的总线时序图如下所示: I2C总线时序图 I2C相关子程序的详细介绍 1、起始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。 2、结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。 起始信号和结束信号的时序图如下所示: 起始信号和结束信号的时序图 起始信号的流程如下:

1、SCL和SDA拉高,保持时间约为0.6us-4us; 2、拉低SDA,保持时间为约为0.6us-4us; 3、拉低时钟线 结束信号的流程如下: 1、SCL置高电平,SDA置低电平,保持时间约为0.6us-4us 2、SDA拉高,保持时间约为1.2-4us; 应答信号:接收数据的IC在接收到8bit数据后,向发送数据的IC发出特定的低电平脉冲,表示已收到数据。CPU向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU接收到应答信号后,根据实际情况作出是否继续传递信号的判断。 若未收到应答信号,由判断为受控单元出现故障。应答信号的时序图如下所示: 应答时序图 发送时的应答信号 ;**********应答信号********** ACK: SETB SDA ;数据线置高 SETB SCL ;时钟线置高 ACALL DELAY JB SDA,$ ;等待数据线变低 ACALL DELAY CLR SCL ;时钟线置低 RET 注意:这里如果数据线一直为高将进入死循环,所以一般我们都会在这做一个容错的处理。具体的程序如下: ACK: MOV R4,#00H SETB SDA SETB SCL LOP0: JNB SDA,LOP DJNZ R4,LOP0 ;循环255次 LOP: ACALL DEL CLR SCL RET 接收时的应答信号

总结和计划有什么区别

总结和计划有什么区别 计划与总结的区别与联系 计划是确定目标、制定实施方案,要明确时限、方法、步骤。 总结是对计划完成情况的检查、回顾和反思,归纳经验、不足,以便于下一步工作的实施。 两者的区别:计划是事前的安排,总结是时候的回顾。 两者的联系:计划是总结的前提,总结是计划的结论。 工作总结与计划范文 一、近段时间工作总结 在我来到这里的两个多月的时间中我通过努力的工作,也有了一点收获,我感觉有必要对自己的工作做一下总结。 目的在于吸取教训,提高自己,以至于把工作做的更好,自己有信心也有决心把下一步的工作做的更好。 下面我对20XX年上半年工作总结汇报如下: 我是今年三月份到公司工作的,在没有负责市场销售管理工作以前,我的销售经验不足,仅凭对销售工作的热情,而缺乏奶

粉行业销售经验和行业知识。 为了迅速融入到这个行业中来,到公司之后,一切从零开始,一边学习产品知识,一边摸索市场,取得了良好的效果。 通过不断的学习产品知识,收取同行业之间的信息和积累市场经验,现在对奶粉市场有了一个大概的认识和了解。 现在我逐渐可以应对客户所提到的问题,把握客户的需要,基本良好的与客户沟通与信任。 所以经过努力,对市场的认识也有一个比较透明的掌握。 在不断的学习产品知识和积累经验的同时,自己的能力,业务水平都比以前有了一个提高,针对市场的一些变化,现在能拿出一些方案应付一些突发事件。 存在的缺点: 对于奶粉市场了解的还不够深入,在与客户的沟通过程中,过分的依赖和相信客户,以至于引起一连串的不良反应。 本职的工作做得不好,感觉自己还停留在一个一般促销人员的位置上,对市场促销人员的管理,培训,指导力度不够。

简单的I2C协议理解 i2c程序(调试通过)

简单的I2C协议理解 一. 技术性能: 工作速率有100K和400K两种; 支持多机通讯; 支持多主控模块,但同一时刻只允许有一个主控; 由数据线SDA和时钟SCL构成的串行总线; 每个电路和模块都有唯一的地址; 每个器件可以使用独立电源 二. 基本工作原理: 以启动信号START来掌管总线,以停止信号STOP来释放总线; 每次通讯以START开始,以STOP结束; 启动信号START后紧接着发送一个地址字节,其中7位为被控器件的地址码,一位为读/写控制位R/W,R /W位为0表示由主控向被控器件写数据,R/W为1表示由主控向被控器件读数据; 当被控器件检测到收到的地址与自己的地址相同时,在第9个时钟期间反馈应答信号; 每个数据字节在传送时都是高位(MSB)在前; 写通讯过程: 1. 主控在检测到总线空闲的状况下,首先发送一个START信号掌管总线; 2. 发送一个地址字节(包括7位地址码和一位R/W); 3. 当被控器件检测到主控发送的地址与自己的地址相同时发送一个应答信号(ACK); 4. 主控收到ACK后开始发送第一个数据字节; 5. 被控器收到数据字节后发送一个ACK表示继续传送数据,发送NACK表示传送数据结束; 6. 主控发送完全部数据后,发送一个停止位STOP,结束整个通讯并且释放总线; 读通讯过程: 1. 主控在检测到总线空闲的状况下,首先发送一个START信号掌管总线; 2. 发送一个地址字节(包括7位地址码和一位R/W); 3. 当被控器件检测到主控发送的地址与自己的地址相同时发送一个应答信

号(ACK); 4. 主控收到ACK后释放数据总线,开始接收第一个数据字节; 5. 主控收到数据后发送ACK表示继续传送数据,发送NACK表示传送数据结束; 6. 主控发送完全部数据后,发送一个停止位STOP,结束整个通讯并且释放总线; 四. 总线信号时序分析 1. 总线空闲状态 SDA和SCL两条信号线都处于高电平,即总线上所有的器件都释放总线,两条信号线各自的上拉电阻把电平拉高; 2. 启动信号START 时钟信号SCL保持高电平,数据信号SDA的电平被拉低(即负跳变)。启动信号必须是跳变信号,而且在建立该信号前必修保证总线处于空闲状态; 3. 停止信号STOP 时钟信号SCL保持高电平,数据线被释放,使得SDA返回高电平(即正跳变),停止信号也必须是跳变信号。 4. 数据传送 SCL线呈现高电平期间,SDA线上的电平必须保持稳定,低电平表示0(此时的线电压为地电压),高电平表示1(此时的电压由元器件的VDD决定)。只有在SCL线为低电平期间,SDA上的电平允许变化。 5. 应答信号ACK I2C总线的数据都是以字节(8位)的方式传送的,发送器件每发送一个字节之后,在时钟的第9个脉冲期间释放数据总线,由接收器发送一个ACK(把数据总线的电平拉低)来表示数据成功接收。 6. 无应答信号NACK 在时钟的第9个脉冲期间发送器释放数据总线,接收器不拉低数据总线表示一个NACK,NACK有两种用途: a. 一般表示接收器未成功接收数据字节; b. 当接收器是主控器时,它收到最后一个字节后,应发送一个NACK信号,以通知被控发送器结束数据发送,并释放总线,以便主控接收器发送一个停止信号STOP。 五. 寻址约定

总结和报告的区别及范文

总结和报告的区别及范文 述职报告与工作总结都是属于事务性文书,难免很多孩纸会把二者混为一谈~其实细细研究,他们还是存在着很大滴区别的。那么如何写述职报告?又如何写工作总结?如何避免把述职报告写成工作总结,又如何避免把工作总结写成述职报告?特与大家分享,希望对要写这两种东西大家有所帮助呀~ 述职报告与工作总结的区别篇一: 述职报告 述职报告是指各级各类机关工作人员,包括履行岗位职责,完成工作任务的成绩、缺点问题、设想,进行自我回顾、评估、鉴定的书面报告。 工作总结就是把一个时间段的工作进行一次全面系统的总检查、总评价、总分析、总研究,分析成绩、不足、经验等。 述职报告主要是领导干部向上级、主管部门和下属群众陈述任职情况。 工作总结是总结工作中的问题,改进不足,以提高自己的工作能力并指导以后的工作。 述职报告的侧重点是展示工作人员履行工作的思路过程和能力,仅限于职责范围之内。 工作总结的侧重点是归纳工作的事实汇总工作的成果,不仅限于职责范围之内~可以写自己为了做好工作学习了什么之类滴~ 述职报告采用夹叙夹议的表达方式,在叙述的同时加入一些观点的议论和说明。 工作总结采用叙述的方式哦,清楚的描述工作的结果和成绩,不要求点评议论~

述职报告一般以“述职至此,谢谢大家”、“特此报告,敬请审阅”等语句结束~ 工作总结一般以今后的工作计划和改进方法结束~ 述职报告与工作总结的区别篇二:述职报告 一年来,在局党组和中心领导的正确领导下,在中心同志的支持配合下,紧紧围绕中心工作和年度考核目标,以严谨细致的工作作风、脚踏实地的工作态度、勇于创新的工作激情、严于律己的工作 标准,团结同志,锐意进取,较好地完成了各项工作任务: 一、以学习为手段,不断提高工作能力 知识就是力量。近年来,我努力加强各方面知识的摄取,充实自己的大脑,增强个人综合素质,提高为民服务的工作能力。一是贯 彻落实科学发展观,坚定为人民服务的工作信念。在“科学发展观”的学习实践活动中,我认真学习,努力研讨。学习邓小平理论、三 个代表重要思想和十八届三中全会精神,不断提高自己的政治觉悟,从思想上和党保持一致。二是与时俱进加强学习,提高为人民服务 的工作能力。学习国家新出台的财经法律法规、财政政策、会计、 税务、金融等方面的知识,通过学习拓宽了眼界,开拓了思维,增 强实际工作中解决问题的能力,提高了为人民服务的本领。 二、从严要求自己,筑牢廉政自律的防线 在日常的工作中,我认真接受群众监督,筑牢理想信念,不断强化政治意识、大局意识和责任意识,切实增强廉洁自律和拒腐防变 的能力;在工作实践中认真做到为民、务实、清廉,牢固树立群众利 益无小事的观念,把群众满意作为“标杆尺度”。时刻牢记党风廉 政建设的责任意识,以身作则、廉洁从政。认真贯彻干部廉洁自律 的各项规定,坚决执行党风廉政建设责任制,在平时的工作中注意 严格要求自己,正确看待权力和地位,自觉增强法律意识,做到洁 身自好,一身正气,规范了自己的言行,养成了奉公守法,清廉为 荣的作风。加强党性党风党纪和廉洁从政教育,积极学习党风廉政 建设理论和法规制度。

I2C总线协议规范 v2.1

THE I2C-BUS SPECIFICATION VERSION 2.1 JANUARY 2000

CONTENTS 1PREFACE. . . . . . . . . . . . . . . . . . . . . . . . . . .3 1.1Version 1.0 - 1992. . . . . . . . . . . . . . . . . . . . 3 1.2Version 2.0 - 198. . . . . . . . . . . . . . . . . . . . . 3 1.3Version 2.1 - 1999. . . . . . . . . . . . . . . . . . . . 3 1.4Purchase of Philips I2C-bus components . . 3 2THE I2C-BUS BENEFITS DESIGNERS AND MANUFACTURERS. . . . . . . . . . . . . . .4 2.1Designer benefits . . . . . . . . . . . . . . . . . . . . 4 2.2Manufacturer benefits. . . . . . . . . . . . . . . . . 6 3INTRODUCTION TO THE I2C-BUS SPECIFICATION . . . . . . . . . . . . . . . . . . . . .6 4THE I2C-BUS CONCEPT . . . . . . . . . . . . . . .6 5GENERAL CHARACTERISTICS . . . . . . . . .8 6BIT TRANSFER . . . . . . . . . . . . . . . . . . . . . .8 6.1Data validity . . . . . . . . . . . . . . . . . . . . . . . . 8 6.2START and STOP conditions. . . . . . . . . . . 9 7TRANSFERRING DATA. . . . . . . . . . . . . . .10 7.1Byte format . . . . . . . . . . . . . . . . . . . . . . . . 10 7.2Acknowledge. . . . . . . . . . . . . . . . . . . . . . . 10 8ARBITRATION AND CLOCK GENERATION . . . . . . . . . . . . . . . . . . . . . .11 8.1Synchronization . . . . . . . . . . . . . . . . . . . . 11 8.2Arbitration . . . . . . . . . . . . . . . . . . . . . . . . . 12 8.3Use of the clock synchronizing mechanism as a handshake. . . . . . . . . . . 13 9FORMATS WITH 7-BIT ADDRESSES. . . .13 107-BIT ADDRESSING . . . . . . . . . . . . . . . . .15 10.1Definition of bits in the first byte . . . . . . . . 15 10.1.1General call address. . . . . . . . . . . . . . . . . 16 10.1.2START byte . . . . . . . . . . . . . . . . . . . . . . . 17 10.1.3CBUS compatibility. . . . . . . . . . . . . . . . . . 18 11EXTENSIONS TO THE STANDARD- MODE I2C-BUS SPECIFICATION . . . . . . .19 12FAST-MODE. . . . . . . . . . . . . . . . . . . . . . . .19 13Hs-MODE . . . . . . . . . . . . . . . . . . . . . . . . . .20 13.1High speed transfer. . . . . . . . . . . . . . . . . . 20 13.2Serial data transfer format in Hs-mode. . . 21 13.3Switching from F/S- to Hs-mode and back . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2313.4Hs-mode devices at lower speed modes. . 24 13.5Mixed speed modes on one serial bus system. . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 13.5.1F/S-mode transfer in a mixed-speed bus system. . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 13.5.2Hs-mode transfer in a mixed-speed bus system. . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 13.5.3Timing requirements for the bridge in a mixed-speed bus system. . . . . . . . . . . . . . 27 1410-BIT ADDRESSING. . . . . . . . . . . . . . . . 27 14.1Definition of bits in the first two bytes. . . . . 27 14.2Formats with 10-bit addresses. . . . . . . . . . 27 14.3General call address and start byte with 10-bit addressing. . . . . . . . . . . . . . . . . . . . 30 15ELECTRICAL SPECIFICATIONS AND TIMING FOR I/O STAGES AND BUS LINES. . . . . . . . . . . . . . . . . . . . 30 15.1Standard- and Fast-mode devices. . . . . . . 30 15.2Hs-mode devices. . . . . . . . . . . . . . . . . . . . 34 16ELECTRICAL CONNECTIONS OF I2C-BUS DEVICES TO THE BUS LINES . 37 16.1Maximum and minimum values of resistors R p and R s for Standard-mode I2C-bus devices . . . . . . . . . . . . . . . . . . . . . 39 17APPLICATION INFORMATION. . . . . . . . . 41 17.1Slope-controlled output stages of Fast-mode I2C-bus devices. . . . . . . . . . . . 41 17.2Switched pull-up circuit for Fast-mode I2C-bus devices . . . . . . . . . . . . . . . . . . . . . 41 17.3Wiring pattern of the bus lines. . . . . . . . . . 42 17.4Maximum and minimum values of resistors R p and R s for Fast-mode I2C-bus devices . . . . . . . . . . . . . . . . . . . . . 42 17.5Maximum and minimum values of resistors R p and R s for Hs-mode I2C-bus devices . . . . . . . . . . . . . . . . . . . . . 42 18BI-DIRECTIONAL LEVEL SHIFTER FOR F/S-MODE I2C-BUS SYSTEMS . . . . 42 18.1Connecting devices with different logic levels. . . . . . . . . . . . . . . . . . . . . . . . . 43 18.1.1Operation of the level shifter . . . . . . . . . . . 44 19DEVELOPMENT TOOLS AVAILABLE FROM PHILIPS. . . . . . . . . . . . . . . . . . . . . 45 20SUPPORT LITERATURE . . . . . . . . . . . . . 46

述职报告和工作总结的区别

述职报告与工作总结的区别 工作总结是总结你一年的工作,包括业绩、不足与改进等等;述职报告是你对去年制定的计划的一个完成统计,并说明未完成原因,还有新的一年的工作计划,需要公司及各部门在哪些方面给予什么帮助与支持!总的来说,工作总结表功绩,述职报告找毛病! 什么是述职报告 述职报告是指各级各类机关工作人员,主要是领导干部向上级、主管部门和下属群众陈述任职情况,包括履行岗位职责,完成工作任务的成绩、缺点问题、设想,进行自我回顾、评估、鉴定的书面报告。 述职报告怎么写 述职报告是大型企业、规范企业进行个人年度总结的一种形式。一般是针对个人一年的岗位职责执行情况、个人指标完成情况进行总结性答复。 述职报告的写作方式一般为2种: 一是四大段式,即做法+成绩+不足+改进。 二是逐条答复式。每条职责需逐个回答:做法+效果+问题+改进。 采取哪种方式根据人力资源部门或上级的要求进行。 写好述职报告要把握五个要点:

一、写出信心。 不管你的工作情况如何,写述职报告时一定要写出你的信心。干好了,总结经验;干得不好,找出问题,分析原因,制定切实可行的对策,树立来年能做好此项工作的信心。 一般领导都是向前看的。你干得不好,交了学费,知道了不足,来年会改进。若换了新人,没准还要交更多的学费。 这里关键是看你的态度和信心。今年没干好,你对自己都没信心,灰头丧气,别人怎能会对你有信心 不怕有缺点,就怕没自信。 二、写出成绩。 可不是“成绩不说没不了,问题不着不得了”,成绩不说也不得了,现在都实行层次管理,况且人力资源部门对你不会有太多了解,成绩一定要写足,这也是培养自信心的好办法。写成绩时切忌两大“戒”,一戒“吹”。让人感觉你有一点在吹,不实事求是,对你的好印象立即减少50%,搞不好会归入“另类”。二戒“傲”。只谈个人的努力,大谈自己的本领,不讲领导和同事的帮助,不讲客观上遇到好的机遇,自信心过强,叫自大了。这样也会进入“骄傲”、“不合群”、“不成熟”的另类。 三、写出特点。

关于IIC的通信协议程序

#define uchar unsigned char #define uint unsigned int #define ulong unsigned long #define _BV(bit) (1 << (bit)) #ifndef cbi #define cbi(reg,bit) reg &= ~_BV(bit) #endif #ifndef sbi #define sbi(reg,bit) reg |= _BV(bit) #endif extern uchar dog; /* void delay_1ms(uchar xtal) { uchar i; for(i=0;i<(uint)(143*xtal-2);i++) {;} } //2 延时nms void delay_ms(uchar m, uchar fosc) { uchar i; i=0; while(i

工作总结范文精选:做总结和作总结的区别

做总结和作总结的区别 一、含义和作用不同 述职报告主要是一种各级领导干部陈述和评估自己一个时期履行职务的情况而通过口头表达的书面材料,是上级领导和组织人事部门考察、培养、使用干部的重要依据。其作用主要是:便于组织、人事部门考核、选拔和任用德才兼备的干部;便于群众监督评议,强化干部的公仆意识和人民群众的主人翁地位;能够促进被考察人员不断总结经验,明确自身职责,努力提高政治思想水平、领导才干和业务素质,廉政勤政,爱岗敬业。 个人总结是对前一段工作的检查和回顾。对已经历的实践进行分析、研究和评价而形成的一种应用文。其作用是从理论的高度,概括出经验教训,抓住事物的本质,找出事物发展规律,以指导今后的工作。 述职报告重在展现个人工作能力、思想水平等,个人 二、行文目的不同 述职报告的目的是向领导和群众汇报、评估自己的德、能、勤、绩的真实情况。述职报告中的总结,自我评估性非常突出,其评估结论是否恰当也是领导所要审查和大众做要评议的内容之一。就供审查评议之用这一点,是一般工作总结所不具备有的。工作总结要求写出规律性的东西,特点在于理论性。要对工作中的得失利弊进行分析评价,必须把感性认识上升到理性认识,提出科学结论,才能用以指导下一步实践,提高工作水平。

三、表达方式不同 述职报告要当众宣读,具有很强的透明性,其表达方式,包括思想观点、材料内容、结构安排、语言运用等的优劣,都直接反映着述职者的工作态度和基本素质,以致影响到述职者的形象和任用。 述职报告主要表达方式是叙述、说明而不是议论,比如不必过多写“通过者接顿的实践,使我深刻认识到……”。有关职务职责岗位的重要程度也不宜多写,相对于此,写总结是为了交流工作经验,因此要去总结规律性的东西,有关经验和教训的心得要大写特写。 述职,即汇报自己的任职情况,要使听众了解自己工作做的怎么样,是否称职,最重要的莫过于把所做的工作实绩叙说清楚,评估自己必须简短扼要,点到为止。表述自己的政绩业绩,要防止面面俱到、轻重不分,而对一些难题的应对思路和重大问题的解决过程,以及最后的效果和影响则是写作重点。在主要陈述了业绩以后,还要找出自己工作中的失误和不足,并且一定要实事求是,具体问题具体分析。有些应当解决而自身暂时还不具备解决条件或确实无力解决的实际困难也可以写出来,以引起上级领导和职工群众的重视,争取在他们的帮助下得到解决。 个人工作总结的写作,带有探索事物客观规律的研究性,因此表述重在证明,表述手段是论证,要用自身实践活动中真实的、典型的材料来证明它所提出的各个判断的正确性。夹叙夹议的写法很常见。 四、写作立意和角度不同

AT24C02数据存储I2C协议-串口通讯

/****************************************** 绿盾电子 X-13 多传感器开发板 功能:实现读写AT24C02型号的EEPROM存储。该类型存储器具有掉电数据保护功能,是单片 机项目开发中常用的芯片。AT24C02使用 I2C总线与的单片机通信,只需两根线即 可完成读写功能。 串口输出数据,串口是单片机程序调试种 最常用最重要的工具。在使用前需要主要 开发板当前晶振频率是否为11.0592MHz,如 不是,请更换晶振,或者自行计算定时器 数值。 时间:2011-8-23 ******************************************/ //头文件 #include "reg51.h" #include //宏定义 #define uchar unsigned char #define uint unsigned int

//引脚定义 sbit Scl= P3^6; //AT24C0x串行时钟sbit Sda= P3^7; //AT24C0x串行数据 //全局变量 uchar EEPROM_WriteBuffer[] = {"https://www.doczj.com/doc/3714467488.html,"}; uchar EEPROM_ReadBuffer[20]; //函数声明 /******************************************/ //延时子函时, //参数 d_time 控制延时的时间 //作用,灯亮和熄灭必须持续一定时间,人眼才能看到 void delay(unsigned int time); /******************************************/ //延时子函数 //参数范围 0-65536 void delay(unsigned int time) //参数 time 大小 { //决定延时时间长短 while(time--); }

述职汇报与总结归纳的区别

述职汇报与总结归纳的区别 述职报告与工作总结的区别 以下是为大家整理的关于述职报告与工作总结的区别,希望大家能够喜欢! 述职报告和个人工作总结是使用比较频繁的两种事务文书。在实际工作中,有不少人在拟写述职报告时,往往把它写成个人工作总结,将两者混为一谈。要准确掌握它们的写法,关键在弄清两者的区别。 一、概念不同 概念是反映对象本质属性的。述职报告和个人工作总结在概念的本质上有所不同,应把两者加以区分开来。述职报告是各类公职人员向所在单位的组织、人事部门、上级机关和职工群众,如实陈述本人在一定时期内履行岗位职责情况的一种事务文书。《孟子·梁惠王上》说:“诸侯朝天子日述职。述职者,述所职也。无非事者。”可见,所谓述职就是陈述职守,报告职责范围内的工作,而不涉及与本职无关的事项。而个人工作总结则是个人对做过的某一阶段的工作进行系统的回顾、分析,从中找出收获、经验教训及带有规律性的认识的一种事务文书。 二、目的作用不同 述职报告和个人工作总结行文的目的和作用是不一样的。述职报告是群众评议组织、人事部门考核述职干部的重要文字依据,不仅有利于述职者进一步明确职责,总结经验、吸取教训、提高素质、改进

工作,还有利于增强民主监督的良好风气。而个人工作总结则是为了总结出带有规律性的理性认识,借以指导今后的工作,同时,也有助于针对性地克服工作中存在的问题,不断提高自身的工作能力。 三、回答的问题不同 两者在具体写作中,文中具体所要回答的问题也有所不同。个人工作总结是对一项工作或一段时间里的工作给予的归纳,它要回答的是做了哪些工作,有哪些成绩,取得了哪些经验,存在哪些不足,要吸取什么教训,今后有何打算等问题。而述职报告要回答的是有什么职责,履行职责如何,是如何履行职责的。称职与否等问题。既要表述履行职责的结果,展示履行职责的过程,又要介绍履行职责的出发点和思路,还要申述处理问题的依据和理由。 四、写作的侧重点不同 应用文在写作时,并不是对每个部分平均分配笔墨,把所有的材料罗列开来,而是有所侧重,详略得当。在这点上,述职报告与个人工作总结在写作的侧重点,主要着笔的地方也有所不同。个人工作总结一般以归纳工作事实、汇总工作成果为主。重点在于阐述主要工作,取得的成绩都可以归纳在总结之中。而述职报告则必须以报告履行职责情况、报告德才能绩为主,重点在于展示履行职责的思路、过程和能力,重点和范围有确定性,仅限于职责的范围之内,围绕职责这个基点精选材料,职责范围外的概不涉及。 五、结束语不同 应用文的结构一般有固定的模式,它崇尚程式化的结构,循规蹈

i2c通讯协议及程序

I2C通信协议简介 (2013-01-17 10:48:03) 转载▼ 分类:通讯协议 标签: 杂谈 ACK是acknowledge的意思,确认. 摒弃复杂的情况,这里只对I2C做简单的介绍。 一、I2C 总线的一些特征: ? 只要求两条总线线路一条串行数据线SDA一条串行时钟线SCL ? 每个连接到总线的器件都可以通过唯一的地址和一直存在的简单的主机从机关系软件设定地址主机可以作为主机发送器或主机接收器? 它是一个真正的多主机总线如果两个或更多主机同时初始化数据传输可以通过冲突检测和仲裁防止数据被破坏 ? 串行的8 位双向数据传输位速率在标准模式下可达100kbit/s 快速模式下可达400kbit/s 高速模式下可达3.4Mbit/s ? 片上的滤波器可以滤去总线数据线上的毛刺波保证数据完整 ? 连接到相同总线的IC 数量只受到总线的最大电容400pF 限制 二、I2C总线在传送数据过程中共有三种类型信号:开始信号、结束信号和应答信号。 开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。 结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。 应答信号:接收数据的IC在接收到8bit数据后,向发送数据的IC发出特定的低电平脉冲,表示已收到数据 起始和结束:

bool I2C_Start(void) { SDA_H; SCL_H; I2C_delay(); if(!SDA_read)return FALSE; // SDA线为低电平则总线忙,退出 SDA_L; // 拉低SDA线(当SCL为高电平时,SDA由高电平向低电平跳变表示开始信号) I2C_delay(); if(SDA_read) return FALSE; // SDA线为高电平则总线出错,退出 SDA_L; //数据为准备好时,拉低SCL线 I2C_delay(); return TRUE; } 发出开始信号之后,设备在数据未准备好时,拉低SCL线,这样主设备可知从设备未发送数据,从设备在数据准备好,可以发送的时候,停止拉低SCL线,这时候才开始真正的数据传输 void I2C_Stop(void) { SCL_L; I2C_delay(); SDA_L; I2C_delay(); SCL_H; // SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据 I2C_delay(); SDA_H; I2C_delay(); }

关于工作总结——为什么要写总结

为什么要写结 一、为什么要写结 曾经看过一篇文章,作者把职场人员分为两种类型:做的和不做的;做的又分为两种:认真做的和应付地做的;认真做的又分为两种:做后总结的和做后没有总结的。最后,世界上的职场人员就有了成功和失败之分,前一类成功了,后一类失败了。所以有人总结出“总结能力是职场成长的跳板”,这话是很有道理的。 我们说:目标就像大海中的导航灯,它指引我们工作的方向,不让我们迷途、偏轨;而计划就是我们为了达到目标而量身定做的步骤与工作方法,它不断地告诉我们离目标的距离、时间,是衡量我们完成目标的一个又一个的标杆。但我想问问在座的各位:是不是有了目标、有了计划企业就能正常运作吗?就能如期如愿的到达我们的目的地吗?。。。。。(大家思考,并请人回答、解说) 什么是戴明循环理论(提问)? 戴明循环理论就是PDCA企业管理循环系统,企业管理其实是一个从Plan—Do—Check —Action,即:计划—执行—检查—行动的一个循环不止的运作系统,对总结检查的结果进行处理,成功的经验加以肯定并适当推广、标准化;失败的教训加以总结,未解决的问题放到下一个PDCA循环里。 也就是告诉我们,不论做什么事情我们首先要学会作计划,然后按照计划执行,在执行的过程中,我们要不段的去检测、修正,再行动,再检测、再修正,再行动,直至一个目标的完成,继续制定新的目标、新的计划,周而复始,往复循环,逐步提升企业的业绩、扩大企业的规模,达到企业的长短期规划。。。。 我说总结就是一个检测、是一个评估,大家认可吗? 什么是检测,检测就是对我们以前的工作好的方面认识,并继续发扬;不足的方面也要认识,并在下次工作中不让它再次产生。管理学上有一句话:企业在改革和发展中,要允许职员犯错误,没有错误也就没有发展(大家认可吗?)。。。但是相同的错误不允许发生两次。一个错误一而再、再而三的发生,说明了一个人在工作中根本没有研究错误发生的原因,没有研究,当然也就无法规避,无法规避当然也就再次发生,试问,一个企业如此经营能发展吗?我想不用我说,得到的结论肯定是:无法进步,更别谈改革和发展了。 案例:两个销售员的不同工作方法带来得不同销售结果 曾经有两个销售员是同一天到公司的上班的,两个人是老乡都是陕西人,一个姓王,一个姓肖。两个人开始干的都是派发宣传单的工作,还负责专柜的促销。小王人长的不如小肖帅,但人缘特别好,见了人就笑,是个自来熟,同时他每天作工作总结写心理笔记。如今天见了什么客户?属于什么性格?我采取的营销模式?这种模式的利与弊,以后遇到这种类型的客户我应该采取那种最有效的谈话方式更容易谈妥生意?。。。。等等;小肖工作特别认真,你交给的工作会一丝不苟的完成,但一点也不会多干,也不会做业务之外的事情,是一个懂得生活享受的人。 开始两个月,小肖的业绩比小王好,可到了第三个月,小王的业绩就开始超过小肖,半年后,小王的业绩是小肖的两倍还多。公司就升小王为业务经理,可小肖特别不服气,觉得两个人一起到公司,他工作也很认真,为什么只升小王的职?公司销售总监说:这样你们两人都去同一个镇各开发一家新药店客户,让实力说话。他们两人就准备好产品样板出发了。第二天,他们回来同时汇报。小肖先说:我已经和药店谈好了,以代销的方式先合作。销量起来后,再现金合作。最终价格需要老板你自己决定。小王说:我总共谈了5家药店,三家药店都同意现金合作,其他两家代销。不过代销的价格要高出现金价格的10%,。。。。。随后小王把每一个药店的情况作了汇报,还把公司的其他产品也都谈进去了。这时销售总监问小

I2C总线协议程序

C程序代码]I2C总线协议程序 程序代码 2009-10-11 14:05 阅读48 评论0 /**************************************************************** I2C总线协议程序 ****************************************************************/ #define NOP {_nop_();_nop_();_nop_();_nop_();} sbit SDA=P1^2; /*模拟I2C数据传送位*/ sbit SCL=P1^3; /*模拟I2C时钟控制位*/ bit ack; /*应答标志位*/ void Start_I2c() { SDA=1; NOP; SCL=1; NOP; SDA=0; NOP; SCL=0; NOP; } void Stop_I2c() { SDA=0; NOP;

SCL=1; NOP; SDA=1; NOP; } void Senduchar(uchar c) { uchar i; for(i=0;i<8;i++) { c<<=1; SDA=CY; NOP; SCL=1; NOP; SCL=0; NOP; } SDA=1; NOP; SCL=1; NOP; if(SDA==1) ack=0; else ack=1; SCL=0; NOP; } uchar Rcvuchar() {

uchar i,x=0; SDA=1; for(i=0;i<8;i++) { SCL=0; NOP; SCL=1; NOP; x=x<<1; if(SDA) x=x+1; NOP; } SCL=0; NOP; return(x); } void Ack_I2c(bit a) { SDA=a; NOP; SCL=1; NOP; SCL=0; NOP; } bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no) { uchar i;

工作报告和总结报告区别

工作报告和总结报告区别 篇一:总结与工作报告的区别 “总结”与“工作报告”的区别和联系 总结和工作报告是日常工作中经常使用的应用文种,但在具体应用过程中却总是将二者相互混淆,笔者通过查阅资料认为可以从文种使用范畴和主体内容两个方面来把握二者之间的差异。 一、文种的使用范畴不同 总结与工作报告虽都属于应用文,但总结为一般事务性应用文,而工作报告属于法定公文的一种,二者在使用范畴、行文规范和用语要求上有明显的差异。 在使用范畴方面,总结比工作报告使用范围广泛。“总结”是单位、部门或个人对前一段的实践活动进行回顾、检查、分析和研究,从中找出经验教训和规律性的认识,从而指导今后实践而写成的应用文,在适用范围上既可以是单位与部门,又可以是个人;而“工作报告”是指向上级机关汇报本单位、本部门工作情况、做法、经验以及问题的报告。工作报告主要是在汇报例行工作或临时工作情况时使用,属于公文报告的一种,只适用于机关、团体或企事业单位。 在行文规范与用语要求方面,总结要比工作报告宽松。在行文要求上:总结的标题可使用公文式格式标题,如“关于×××的总结”,也可使用一般文章标题,如:“变化发展

中的×××:还可以使用具有新闻特色的双标题,如”创新管理,狠抓落实——×××工作总结;而工作报告则一般使用完整的公文标题,即“×××(单位名称)关于×××(事项)工作的报告”。此外,总结没有专属的文种结束语,而工作报告则常以“特此报告”、“专此报告”、“以上报告,请审阅”等用于做结。在用语要求上:总结作为一般应用文其语言简明扼要即可,而工作报告作为上行公文的一种,其用于除了简明扼要以外,还需兼备所有公文用语严谨、庄重及上行文谦恭的特点。 篇二:结题研究报告与工作报告的区别 结题研究报告与工作报告的区别 结题的一项重要工作就是在搜集和整理资料与数据的基础上,进行提炼,形成某种形式的研究成果,并对这些成果进行完善。 课题研究成果大致可分为以下几类: (一)研究报告(5000字-8000字) 研究报告是对课题研究的最为集中的阐述和说明,是最重要的研究成果之一,是专家和上级科研部门鉴定研究成果的主要依据。撰写好研究报告是结题工作中极为重要的一项工作。 撰写研究报告,可以组成“写作小组”,由他们拟出“报告的详细提纲”,提纲经研讨通过后再动笔写出初稿,初稿

相关主题
文本预览
相关文档 最新文档