当前位置:文档之家› 如何使用M68HC08、HCS08和HCS12系列MCU的IIC模块(中文)

如何使用M68HC08、HCS08和HCS12系列MCU的IIC模块(中文)

如何使用M68HC08、HCS08和HCS12系列MCU的IIC模块(中文)
如何使用M68HC08、HCS08和HCS12系列MCU的IIC模块(中文)

飞思卡尔应用笔记AN3291

如何使用M68HC08、HCS08和HCS12系列MCU的IIC模块

文件编号:AN3291

版本:2,04/2007

苏州大学飞思卡尔嵌入式系统示范实验室译

2008年5月

目录

1 引言 (1)

2 IIC总线概述 (1)

2.1 IIC总线的相关术语 (1)

2.2 位的传输 (2)

2.3 开始和结束信号 (2)

2.4 总线通信 (3)

2.5 控制字节 (3)

2.6 地址字节 (4)

2.7 应答 (5)

2.8 读/写格式 (5)

3 各MCU的IIC软件例程 (6)

3.1 IIC的初始化 (6)

3.2 写函数 (7)

3.3 读函数 (11)

3.4 使用中断的实例 (18)

3.4.1 MCU作为主机 (18)

3.4.2 MCU作为从机 (22)

4 结论 (24)

如何使用M68HC08、HCS08和HCS12

系列MCU的IIC模块

Stanislav Arendarik

应用工程师

捷克共和国 Roznov 1 引言

本应用笔记举例说明了如何使用Freescale MCU的IIC模块。IIC模块可工作在主机或从机模式下。IIC总线主要用于MCU和IIC外设之间的通信,在本应用笔记中,IIC模块工作于主机模式,与串行EEPROM设备通信。对于两个主机之间的直接通信,IIC总线也可以的,但是SPI总线更适合这种情况。

本应用笔记总结了普通IIC总线的状态和定义,并通过MCU中IIC作为主机模式情况下,与EEPROM(24C16和24C512)是如何通信的实例,讲述IIC总线的工作方式。读者可以很简单地用另一个IIC设备来替代EEPROM,但是必须修改IIC地址字节——它用于辨别从设备。

2 IIC总线概述

IIC总线是一种基于“线与”逻辑(开漏输出)的两线制总线,在主机和从机之间可以进行双向通信。为了发挥正常功能,使用了上拉电阻。每次传输都是从主机发出,由从机响应或应答。

2.1 IIC总线的相关术语

本应用笔记使用了以下IIC总线术语:

发送器——将数据发送到总线的设备。发送器可以主动将数据放到总线上(主机发送器),或响应来自另一个设备的数据请求(从机发送器)。

接收器——从总线接收数据的设备。

主机——用于初始化传输过程,产生时钟信号和终止发送器的器件。主机可以是发送器也可以是接收器。

从机——由主机寻址的设备。从机可以是发送器也可以是接收器。

多主机——有能力使一个以上的主机在总线上共存,却不会出现冲突或数据

丢失。

仲裁——预先安排的机制,每次只授权一个主机可以控制总线。 同步——预先安排的机制,对两个或多个主机提供的时钟信号进行同步。 SDA ——数据信号线(串行数据)。 SCL ——时钟信号线(串行时钟)。

SDA 和SCL 都是双向线,通过电流源或上拉电阻连到供电电源的正极。在总线空闲时,两根线都处在高电平。IIC 总线上的数据传输速度在标准模式下可达100kbit/s ,在快速模式下可达400100kbit/s ,在高速模式下高达3.4Mbit/s 。可连到总线上的设备数仅取决于总线电容;极限是400pF 。

2.2 位的传输

在时钟的高电平期间,SDA 线上的数据必须是稳定的。只有当SCL 线上的时钟信号处在低电平时才可改变SDA 线上的高低电平状态。 2.3 开始和结束信号

在IIC 总线的机制中有独特情况的出现被定义为开始和结束信号(如图2所示)。当SCL 线为高电平时,SDA 线上的从高电平到低电平的跳变是一个开始信号(START )。当SCL 线是低电平时,SDA 线上的从低电平到高电平的跳变是一个结束信号(STOP )。总是由主机来产生开始和结束信号。在结束信号之后和开始信号之前,如果SDA 和SCL 线保持高电平,那么总线是空闲的。

图1 位的传输

数据线稳定 数据有效

数据 变化

S = 开始信号P = 结束信号

图2 开始和结束信号

2.4 总线通信

总线传输协议是基于字节的传输,每个字节后都要跟一个应答位(ACK)。字节传输从最高位(MSB)开始到最低位(LSB)。SCL线上的时钟正脉冲作为每个位的采样点。第9个SCL脉冲信号为ACK位采样点。

每次总线传输都是从主机发送START开始。后续字节的顺序取决于要通过IIC总线传输的数据。

2.5 控制字节

控制字节总是跟在START之后,用于选择和激活总线上的具体设备。控制字节的结构如图3所示。前4位表示从机的控制代码。例如,对EEPROM的控制字节为A0(二进制的控制代码为‘1010’)。接下来的3位是片选,对连到总线上的各EEPROM进行选择。这三位用于EEPROM的多设备运行,但是在存储器的地址字节大于8或16位时,它们被用作内部EEPROM地址的高位。该地址取决于EEPROM的容量。例如,如果容量在16kbits范围内,这三位就表示该地址的高三位。

第8位为R/W(读/写)位。此位决定对从设备的请求操作:

该位等于0,表示写操作。

该位等于1,表示读操作。

最后第9位是ACK位,在本例中总是由从机产生。

2.6 地址字节

地址字节为从机提供了地址信息。该字节决定需要写入或读出的数据在EEPROM 中的实际地址。该地址信息的结构取决于所连的EEPROM 的容量。16kbits 的EEPROM 用一个地址字节,但是更大容量的EEPROM 需要两个地址字节(地址H 和地址L )。先发送地址H 。1字节的地址字节的结构如图4所示,2字节的如图5所示。24C16和24C512型的EEPROM 都作通信设备用。

图3 控制字节的结构

图4 1字节地址的IIC 写入格式

控制代码

地址位

从机地址

开始位

读/写位 应答位

控制字节 字地址 数据字节

总线行为

总线行为

主机

2.7 应答

应答位(ACK )就是在SCL 线上第9个脉冲期间的SDA 线上的低电平脉冲。总是由主机来产生SCL 脉冲,由接收器来产生ACK 脉冲。意思就是说对于写操作,每传输完一个字节,从机设备就产生一个ACK 。对于读操作,当主机发送完控制字节和地址字节后,从机产生ACK ;当主机接收到来自从机的数据后,主机产生ACK 。

2.8 读/写格式

IIC 总线有两种数据传输类型: z 从从机读 z 向从机写

在执行写操作时,地址字节后跟一个数据字节。这个数据字节包含了将要写入到地址字节所指地址的实际数据;参见图4和图5。

在通信协议的第一部分,执行读操作时: 1.主机将实际地址写入从机。

2.主机往总线发送重复的START 信号,接着发送控制字节,其中R/W 等于1。

3.从设备发送ACK ,并立即发送被请求的数据。 读操作的结构如图6所示。

图5 2字节地址的IIC 写入格式

数据字节

字地址H

字地址L

控制字节 总线行为 主机

总线行为

字节的读和写操作如图4、图5、图6所示。第二种数据传输方式为页的读和写操作。关于这些传输方式的更多资料参见从机数据手册。

3 各MCU 的IIC 软件例程

对所有IIC 模块的详细描述可以从MCU 的数据手册中找到,以下是一个简单的回顾:

地址寄存器—— 在HC908 MCU 中的使用与S08和S12 MCU 中的使用不同。HC908核中,在START 后自动发送地址寄存器的内容,接着发送数据寄存器的内容。在从机模式下,这个地址寄存器也可以作为自己的IIC 从机地址。S08和S12核中,只有在从机模式才激活地址寄存器,其内容为它自己的在总线上的IIC 从机地址。这可用于总线上连有多MCU 的情况。

分频寄存器 —— 决定SCL 的时钟速度。IIC 模块将总线频率作为源频率。 控制寄存器 —— 控制IIC 模块的所有功能。 状态寄存器 —— 包含总线的实际状态信息。

数据寄存器 —— 作为从总线上传输的所有信息的输入和输出点。

3.1 IIC 的初始化

主要任务是正确设置SCL 时钟信号的频率。这些时钟是基于总线频率的。下一个任务就是设置IIC 模块的功能 —— 是否使用中断服务例程,激活IIC 模块以及设置从机模式。参见实例1、实例2和实例3。

实例1 HC908 MCU 的软件(使用MC68HC908AP64)

void init_I2C (void) {

MMCR1_MMEN = 1; // Enable IIC;

图6 读操作的结构

总线行为 主机

总线行为 控制字节 字地址 控制字节

数据字节

MMCR1_MMCLRBB = 1; // Clear bus busy flag;

MMCR1_MMTXAK = 1;

MMCR2_MMRW = 0; // R/W bit = 0;

MMCR2_MMAST = 0; // Slave mode actually;

MMCR2_MMNAKIF = 0;

MMCR2_MMALIF = 0; // Clear flags;

MMSR = 0; // Clear all flags (Status register);

MMFDR = 3; // Set speed to 25kHz for Bus = 4MHz;

}

实例2 S12 MCU的软件(使用MC9S12DP256B)

void Init_I2C(void)

{

IBFD = 0x4C; // frequency divider register: Bus = 8MHz => SCL = 91kHz;

IBAD = 0x00; // slave address of this module;

IBCR = 0x80; // enable I2C module and No interrupts;

}

实例3 S08 MCU的软件(使用MC9S08GB60)

void Init_I2C (void)

{

IIC1C_IIC1EN = 1; // Enable I2C;

IIC1C_TXAK = 1; // not generate ACK by master after transfer;

IIC1C_MST = 0; // Slave mode actually;

IIC1F = 0x99; // Set speed to 50kHz for Bus = 18.8743MHz;

// 12.5k->0x39; 50k->0x99; 100k->0x59;

IIC1S_SRW = 0; // R/W bit = 0;

}

3.2 写函数

首先讨论根据地址对从机的写入。为了继续这项任务,通过发送START位,

接着发送从机地址字节来激活与从机的通信。这些位的内容在2.6节“地址字节”讨论过了。当主机发送完这个字节后,从机在第9个SCL脉冲到达时发送ACK位。从机必须响应主机发送的每个字节。

下一个字节(第二个字节)是存储阵列的内部地址。这个地址可以是1个字节也可以是2个字节,取决于存储器的大小。从机必须响应主机发送的每个字节。

第三个(对大存储器是第四个)字节是数据字节——这个数据将被写入到指定的地址。该数据字节后紧跟从机的ACK。主机在接收到这个ACK位后产生STOP位。此时,从机在内部从IIC总线上断开连接,并处理写操作。在处理被请求的操作(写)期间,从机不能接受主机的下一个请求。因此,主机必须等待一定的时间,这个时间在从机数据手册中有详细说明,或者主机周期性地向从机发送请求并验证正确的回答(来自从机的ACK)。

实例4 HC908 MCU的写字节(使用MC68HC908AP64和24C16)void I2C_write_byte (byte addr, byte wr_data)

{

MMCR2_MMRW = 0; // Set Write mode;

MMADR = own_sl_addr; // set combined address of Slave for write;

MMDTR = addr; // set address of Slave to read;

//-------start of transmit bytes to IIC bus-----

MMCR2_MMAST = 1; // Start transfer - Master bit = 1;

while (!(MMSR_MMTXBE)); // wait till data transferred;

while (MMSR_MMRXAK); // wait for ACK from slave;

//-----Slave ACK occurred------------

MMDTR = wr_data; // write data byte into EEPROM;

while (!(MMSR_MMTXBE)); // wait till data transferred;

MMDTR = 0xFF; // generate SCL impulse for slave to send ACK bit;

while (MMSR_MMRXAK); // wait for ACK from slave;

MMCR2_MMAST = 0; // STOP bit;

}

实例6和实例7用于大型EEPROM(24C512)。字地址被分成两部分(两字节):低字节和高字节,见实例5。

实例5 分为低字节和高字节的字地址

{

word EE_Address;

struct

{

byte Address_H;

byte Address_L;

}Bytes;

}tAddr;

tAddr sADDR;

#define Address sADDR.EE_Address

#define Addr_L sADDR.Bytes.Address_L

#define Addr_H sADDR.Bytes.Address_H

实例6 9S08 MCU的写字节(使用MC9S08GB60 和 24C16 )

void IIC_write_byte(word addr, byte data)

{

Address = addr; // load address;

temp = (Addr_H & 0x07) << 1;

IIC1C_TXAK = 0; // RX/TX = 1; MS/SL = 1; TXAK = 0;

IIC1C |= 0x30; // And generate START condition;

//-------start of transmit first byte to IIC bus-----

IIC1D = IIC_SLAVE | temp; // Address the slave and set up for master transmit; while (!IIC1S_IICIF); // wait until IBIF;

IIC1S_IICIF=1; // clear the interrupt event flag;

while(IIC1S_RXAK); // check for RXAK;

//-----Slave ACK occurred------------

IIC1D = Addr_L; // Send low byte of the word address;

while (!IIC1S_IICIF); // wait until IBIF;

IIC1S_IICIF=1; // clear the interrupt event flag;

while(IIC1S_RXAK); // check for RXAK;

//-----Slave ACK occurred------------

IIC1D = data;

while (!IIC1S_IICIF); // wait until IBIF;

IIC1S_IICIF=1; // clear the interrupt event flag;

while(IIC1S_RXAK); // check for RXAK;

//-----Slave ACK occurred------------

IIC1S_IICIF=1; // clear the interrupt event flag;

IIC1C_MST = 0; // generate STOP condition;

}

实例7 9S12 MCU的写字节(使用MC9S08GB60 和24C16 )

void IIC_write_byte(word addr, byte data)

{

Address = addr; // load address;

IIC0_IBCR_TXAK = 0; // TXAK = 0;

IIC0_IBCR |= 0x30; // RX/TX = 1; MS/SL = 1; TXAK = 0;

// And generate START condition;

//-------start of transmit first byte to IIC bus-----

IIC0_IBDR = slavewrite; // Address the slave and set up for master transmit; while (!IIC0_IBSR_IBIF); // wait until IBIF;

IIC0_IBSR_IBIF=1; // clear the interrupt event flag;

while(IIC0_IBSR_RXAK); // check for RXAK;

//-----Slave ACK occurred------------

IIC0_IBDR = Addr_H; // Send high byte of the word address;

while (!IIC0_IBSR_IBIF); // wait until IBIF;

IIC0_IBSR_IBIF=1; // clear the interrupt event flag;

while(IIC0_IBSR_RXAK); // check for RXAK;

//-----Slave ACK occurred------------

IIC0_IBDR = Addr_L; // Send low byte of the word address;

while (!IIC0_IBSR_IBIF); // wait until IBIF;

IIC0_IBSR_IBIF=1; // clear the interrupt event flag;

while(IIC0_IBSR_RXAK); // check for RXAK;

//-----Slave ACK occurred------------

IIC0_IBDR = data;

while (!IIC0_IBSR_IBIF); // wait until IBIF;

IIC0_IBSR_IBIF=1; // clear the interrupt event flag;

while(IIC0_IBSR_RXAK); // check for RXAK;

//-----Slave ACK occurred------------

IIC0_IBCR_MS_SL = 0; // generate STOP condition;

}

3.3 读函数

读函数与写函数类似。首先,将地址(字节或字)写入从机。来自从机的ACK总是在这些写周期的后面。就在地址完全写入从机时,主机产生REPEAT START信号。接下来主机再发送控制字节,但是R/W位等于1。这表示从从机读。该字节之后就是从机的ACK位。然后主机必须切换到接收模式,并从IIC数据寄存器(IICDR)中读取数据。该指令为从机产生SCL脉冲,以发送请求地址内的数据。

有两种可能的选择:

z如果不需要从机的下一个数据字节,主机发送NOACK(ACK=1)和STOP信号。

z如果想要读从机的下一个数据字节,主机产生ACK位(ACK=0)。

识别到ACK位后,从机就将内部地址指针指向下一个地址。然后主机从IICDR中读取数据,并产生从机发送数据所需的下一列SCL脉冲。可以无限地重复执行这种步骤。

实例8 HC908系列MCU的读字节(使用HC908AP64 )

byte I2C_read_byte (byte addr)//output is byte "rd_data";

{

MMCR2_MMRW = 0; // Set Write mode;

MMADR = own_sl_addr; // set combined address of Slave for write;

MMDTR = addr; // set address;

//-------start of transmit first byte to IIC bus-----

MMCR2_MMAST = 1; // Start transfer - Master bit = 1;

while (!(MMSR_MMTXBE)); // wait till data transferred;

while (MMSR_MMRXAK); // wait for ACK from slave;

//-----Slave ACK occurred------------

MMCR2_MMRW = 1; // set read operation;

MMCR1_REPSEN = 1; // enable repeat Start bit;

MMCR1_MMTXAK = 0; // Master will generate ACK;

MMCR2_MMAST = 1; // Start transfer - Master bit = 1;

//------start of transmit Repeat start & "A1" to IIC bus-------

MMDTR = 0xFF; // send repeated start and combined address;

while (!(MMSR_MMTXBE)); // wait till data transferred;

while (MMSR_MMRXAK); // wait for ACK from slave;

MMDTR = 0xFF; // send SCL clocks for the slave to send data;

MMCR1_MMTXAK = 1; // Disable master ACK after read byte from Slave;

while (!(MMSR_MMRXBF)); // wait till data received;

rd_data = MMDRR; // read received data;

MMCR2_MMAST = 0; // generate STOP bit - End of transfer;

return rd_data;

}

实例9和实例10是用于大型EEPROM(24C512)。字地址被分成两部分(两字节):低字节和高字节(见实例5)。

实例9 9S08系列MCU的读字节(使用MC9S08GB60 和 24C16 )typedef union

{

word EE_Address;

struct

{

byte Address_H;

byte Address_L;

}Bytes;

}tAddr;

tAddr ADDR;

#define Address ADDR.EE_Address

#define Addr_L ADDR.Bytes.Address_L

#define Addr_H ADDR.Bytes.Address_H

byte IIC_read_byte(word addr)

{

Address = addr;

temp = (Addr_H & 0x07) << 1;

IIC1C_TXAK = 0; // RX/TX = 1; MS/SL = 1; TXAK = 0;

IIC1C |= 0x30; // And generate START condition;

IIC1D = IIC_SLAVE | temp; // Address the slave and set up for master transmit; while (!IIC1S_IICIF); // wait until IBIF;

IIC1S_IICIF=1; // clear the interrupt event flag;

while(IIC1S_RXAK); // check for RXAK;

//-----出现从机ACK------------

IIC1D = Addr_L; // 发送字地址的低字节;

while (!IIC1S_IICIF); // 等待,直到IBIF;

IIC1S_IICIF=1; // 清中断事件标志;

while(IIC1S_RXAK); // 检查RXAK;

//-----出现从机ACK-------------

IIC1C_RSTA = 1; // 设置重新开始;

IIC1D = IIC_SLAVE | temp | 1; // (slave_address) | (RW = 1);

while (!IIC1S_IICIF); //等待,直到IBIF;

IIC1S_IICIF=1; // 清中断事件标志;

while (IIC1S_RXAK); // 检查RXAK;

//-----出现从机ACK -----------

IIC1C_TX = 0; // 准备接收;

IIC1C_TXAK = 1; // 禁止ACK;

RD_data = IIC1D; // 假读;

while (!IIC1S_IICIF); //等待,直到IBIF;

IIC1S_IICIF=1; // 清中断事件标志;

IIC1C_MST = 0; // 产生停止位;

RD_data = IIC1D; // read right data;

return RD_data;

}

实例10 9S12系列MCU的读字节(使用MC9S12DT512 和24C512 )typedef union

{

word EE_Address;

struct

{

byte Address_H;

byte Address_L;

}Bytes;

}tAddr;

tAddr ADDR;

#define Address ADDR.EE_Address

#define Addr_L ADDR.Bytes.Address_L

#define Addr_H ADDR.Bytes.Address_H

void IIC_read_byte(word addr)

{

Address = addr;

IIC0_IBCR_TXAK = 0; // TXAK = 0;

IIC0_IBCR |= 0x30; // RX/TX = 1; MS/SL = 1; TXAK = 0;

// 并产生START条件;

IIC0_IBDR = slavewrite; // 设置从机地址,并启动主机传输;

while (!IIC0_IBSR_IBIF); // 等待,直到IBIF;

IIC0_IBSR_IBIF=1; //清中断事件标志;

while(IIC0_IBSR_RXAK); // 检查RXAK;

//-----出现从机ACK ------------

IIC0_IBDR = Addr_H; //发送字地址的高字节;

while (!IIC0_IBSR_IBIF); //等待,直到IBIF;

IIC0_IBSR_IBIF=1; //清中断事件标志

while(IIC0_IBSR_RXAK); // 检查 RXAK;

//-----出现从机ACK ------------

IIC0_IBDR = Addr_L; //发送字地址的低字节

while (!IIC0_IBSR_IBIF); // 等待,直到IBIF;

IIC0_IBSR_IBIF=1; //清中断事件标志

while(IIC0_IBSR_RXAK); // 检查RXAK;

//-----出现从机ACK ------------

IIC0_IBCR_RSTA = 1; //设置重新开始;

IIC0_IBDR = slaveread; // (slave_address) | (RW = 1);

while (!IIC0_IBSR_IBIF); //等待,直到IBIF;

IIC0_IBSR_IBIF=1; //清中断事件标志

while (IIC0_IBSR_RXAK); // 检查RXAK;

//-----出现从机ACK------------

IIC0_IBCR_TX_RX = 0; // 准备接收

IIC0_IBCR_TXAK = 1; // 禁止ACK

RD_data = IIC0_IBDR; // 假读

while (!IIC0_IBSR_IBIF); // 等待,直到IBIF;

IIC0_IBSR_IBIF=1; // 清中断事件标志

IIC0_IBCR_MS_SL = 0; // 产生停止信号

RD_data = IIC0_IBDR; // 读取正确数据;

}

实例11中给出的例程是9S12核和24C512 EEPROM的块写入和块读出函数。

实例11 9S12核和24C512 EEPROM的块写入/块读出(使用MC9s12XDT512)

void IIC_write_block(word addr, byte len)

{

byte page;

Address = addr; // 加载地址

page = len; // 加载将要写入的数据包的长度

if(page > MAX_PAGE) page = MAX_PAGE; // 设置限制

IIC0_IBCR_TXAK = 0; // TXAK = 0;

IIC0_IBCR |= 0x30; // RX/TX = 1; MS/SL = 1; TXAK = 0;

// 并产生START条件

IIC0_IBDR = slavewrite; // 设置从机地址,并启动主机传输; while (!IIC0_IBSR_IBIF); //等待,直到IBIF;

IIC0_IBSR_IBIF=1; //清中断事件标志

while(IIC0_IBSR_RXAK); //检查RXAK;

IIC0_IBDR = Addr_H; //发送字地址的高字节;

while (!IIC0_IBSR_IBIF); // 等待,直到IBIF;

IIC0_IBSR_IBIF=1; // 清中断事件标志

while(IIC0_IBSR_RXAK); // 检查RXAK;

IIC0_IBDR = Addr_L; // 发送字地址的低字节;

while (!IIC0_IBSR_IBIF); //等待,直到IBIF;

IIC0_IBSR_IBIF=1; //清中断事件标志

while(IIC0_IBSR_RXAK); //检查RXAK;

for(i=0;i

{

IIC0_IBDR = WRData[i];

while (!IIC0_IBSR_IBIF); //等待,直到IBIF;

IIC0_IBSR_IBIF=1; //清中断事件标志

while(IIC0_IBSR_RXAK); //检查RXAK;

}

IIC0_IBCR_MS_SL = 0; //产生停止信号

}

void IIC_read_block(word addr,word len)

{

byte dummy;

Address = addr;

length = len;

if(length > MAX_LENGTH) length = MAX_LENGTH;

IIC0_IBCR_TXAK = 0; // TXAK = 0;

IIC0_IBCR |= 0x30; // RX/TX = 1; MS/SL = 1;

// 产生START 条件

IIC0_IBDR = slavewrite; //设置从机地址并启动主机传输; while (!IIC0_IBSR_IBIF); //等待,直到IBIF;

IIC0_IBSR_IBIF=1; //清中断事件标志

while(IIC0_IBSR_RXAK); //检查RXAK;

IIC0_IBDR = Addr_H; // 发送字地址的高字节

while (!IIC0_IBSR_IBIF); //等待,直到IBIF;

IIC0_IBSR_IBIF=1; //清中断事件标志

while(IIC0_IBSR_RXAK); //检查RXAK;

IIC0_IBDR = Addr_L; //发送字地址的低字节

while (!IIC0_IBSR_IBIF); //等待,直到IBIF;

IIC0_IBSR_IBIF=1; //清中断事件标志

while(IIC0_IBSR_RXAK); //检查RXAK;

IIC0_IBCR_RSTA = 1; // set up repeated start;

IIC0_IBDR = slaveread;

while (!IIC0_IBSR_IBIF); //等待,直到IBIF;

IIC0_IBSR_IBIF=1; //清中断事件标志

while (IIC0_IBSR_RXAK); //检查RXAK;

IIC0_IBCR_TX_RX = 0; // 启动接收

dummy = IIC0_IBDR; // 假读

for(i=0;i

{

while (!IIC0_IBSR_IBIF); //等待,直到IBIF;

IIC0_IBSR_IBIF=1; //清中断事件标志

RDData[i] = IIC0_IBDR; // 将数据存放到RAM中

}

IIC0_IBCR_TXAK = 1; //禁止ACK

while (!IIC0_IBSR_IBIF); //等待,直到IBIF;

IIC0_IBSR_IBIF=1; //清中断事件标志

IIC0_IBCR_MS_SL = 0; //产生停止信号

RDData[i] = IIC0_IBDR; // 将数据存放到RAM中

}

3.4 使用中断的实例

本节介绍了在使用IIC中断服务例程时的两种选项:

z MCU作为主机,从使用的从机读写数据

z在IIC总线上,MCU作为从机

3.4.1 MCU作为主机

当软件的主循环不能轮询IIC通信序列时,使用该例程。第一个动作是唯一在main循环中执行的动作,即第一次写IIC数据寄存器。然后由IIC中断服务例程来维持整个通信。实例12给出了如何设置MCU。

实例12 IIC模块初始化例程

void Init_IIC(void)

{

IICF = 0; // 频率分频寄存器,总线频率= 8MHz => SCL = 400kHz;

IICA = 0; // 该模块的从机地址

IICS = 0x12; // 清IBAL 和IICIF标志;

IICC = 0xC0; // 使能带中断的IIC模块

}

实例13针对串行EEPROM 24AA256和MC9S08QG8 MCU给出了Read_block和Write_block函数。

实例13 Read_block函数和Write_block函数(使用24AA256 EEPROM 和 MC9S08QG8)void IIC_read_block(word addr,byte len)

{

Address = addr;

length = len;

i = 0; //只用于中断

IIC_Res_flg = 0; //只用于中断

flag = 10; // 定义中断服务例程的接收函数;

if(length > MAX_LENGTH) length = MAX_LENGTH;

IICC_TXAK = 0; // RX/TX = 1; MS/SL = 1, TXAK = 0;

电路图、工作原理、调试步骤

1、稳压电源电路图、工作原理、调试步骤 a)仪器的准备 1、调压器 2、变压器 3、指针万用表(2.5A插孔) 4、数字万用表 5、负载电阻12Ω/25W 6、电子电压表 b)电路的功能 该电路是一个串联形直流稳压电路,它是由电源变换电路、整流电路、滤波电路、稳压电路和负载组成。该电路可以实现整流、滤波、稳压。其中稳压部分包括基准电压、取样电路、比较放大器、调整电路等。 c)电路原理图 d)电路的原理 ◆稳压的工作原理 稳压电路是利用负反馈的原理,以输出电压的变化量ΔUL,经取样管VT3与基准电压7.5V(VD5稳压管提供)比较放大后,去控制调整管VT2的基极电流Ib,当Ib增大,调整管Uce将减小;当Ib减小,调整管Uce将增大;使输出电压UL基本保持不变。 当电网电压升高或输出电流减小时: Uo↑→Ub(VT3)↑→Ube(VT3)↑→Ic(VT3)↑→Uc(VT3)↓→Ub(VT1)↓→Ic(VT1)↓→Ic(VT2)↓→Uce(VT2) ↑→Uo↓ 当电网电压下降或输出电流变大时: Uo↓→Ub(VT3) ↓→Ube(VT3) ↓→Ic(VT3) ↓→Uc(VT3) ↑→Ub(VT1) ↑→Ic(VT1) ↑→Ic(VT2) ↑→Uce(VT2) ↓→Uo↓ ◆说明各元件在电路中的作用 VD1、VD2、VD3、VD4桥式整流电路。C6、C7、C8、C9滤波电容、保护整流二极管。VT1、VT2组成复合管,增大等效β值改善稳压性能。C1、C2、C3、C4、C5为滤波电容。R5为VD5限流电阻。R4给VT1的反向穿透电流提供一条通路,防止高温时,VT2出现失控。R8、RP1、R7为VT3分压偏置电阻。R1、R3为VT2负载电阻。R2、R6、R9为VT1偏置、负载电阻。 e)电路的测量步骤

XX通信息公司产品手册

公司简介 上海安达通信息安全技术有限公司(简称:ADT公司)于2002年1月在上海浦东国家信息安全产业化基地成立,专门从事VPN安全网关、身份认证产品的研发、生产和销售,主要解决互联网和内联网的网络信息安全传输和接入身份认证等问题。公司是国家商用密码产品生产定点单位和销售定点单位。公司的主要发起人都是中国信息安全界的精英,对VPN(虚拟专用网)、Firewall、AAA、IDS、PKI等技术领域都有着多年的实践经验和独到见解。 安达通安全网关产品凭借其领先的技术,能够实现任何IP网络环境下的VPN网络的互联和构建。目前公司拥有:融VPN和Firewall功能于一体的ADT安全网关SGW25系列6个型号产品和负载均衡SJW74系列4个型号产品,覆盖从“SOHO级-企业级-电信级”的全系列安全网关设备;支持Windows各平台的安全客户端软件;SSL VPN网关系列;功能完善的ADT安全网管平台,其中包括:策略服务平台、网关监控平台、数字证书平台;动态口令卡等系列网络安全产品。 经过多年来的奋斗,公司拥有一支由博士、硕士、学士组成的,层次合理、富有经验又极具开拓精神的队伍。用户更是遍布大江南北,在电子政务、电信、电力、金融、石化、企事业单位的用户数不胜数。安达通人始终以“为客户创造最大回报”为己任,孜孜不倦,全力解决好客户的每一个问题。您的满意,就是我们最大的幸福! 产品简介 安全网关 安达通安全网关是集“VPN、防火墙、IDS微引擎和病毒过滤引擎”于一体的网络边界安全防护和安全接入设备,它有效地实现了“主/被动安全防御”的完美结合。其特别强大的VPN功能和高安全性、高性价比的多功能集成,是当今网络安全技术发展的主流方向。 安达通安全网关全部采用嵌入式硬件平台和实时操作系统,高性能,低功耗,高可靠。产品线覆盖从“SOHO级-企业级-运营商级”全系列产品;安全网关集中管理和监控平台支持各种规模的安全网关组建的VPN网络的集中管理和监控。安达通突破了各种技术障碍,能够提供针对任何IP网络环境下的VPN互连、入侵防护和病毒防御的一体化解决方案。 安达通安全网关具有两大产品系列:1)支持单线路接入的SGW25安全网关系列;2)支持多线路接入的SJW74负载均衡安全网关系列。

iic设备驱动程序.doc

IIC设备驱动程序 IIC设备是一种通过IIC总线连接的设备,由于其简单性,被广泛引用于电子系统中。在现代电子系统中,有很多的IIC设备需要进行相互之间通信 IIC总线是由PHILIPS公司开发的两线式串行总线,用于连接微处理器和外部IIC设备。IIC设备产生于20世纪80年代,最初专用与音频和视频设备,现在在各种电子设备中都广泛应用 IIC总线有两条总线线路,一条是串行数据线(SDA),一条是串行时钟线(SCL)。SDA负责数据传输,SCL负责数据传输的时钟同步。IIC设备通过这两条总线连接到处理器的IIC总线控制器上。一种典型的设备连接如图: 与其他总线相比,IIC总线有很多重要的特点。在选择一种设备来完成特定功能时,这些特点是选择IIC设备的重要依据。 主要特点: 1,每一个连接到总线的设备都可以通过唯一的设备地址单独访问 2,串行的8位双向数据传输,位速率在标准模式下可达到100kb/s;快速模式下可以达到400kb/s;告诉模式下可以达到3.4Mb/s 3,总线长度最长7.6m左右 4,片上滤波器可以增加抗干扰能力,保证数据的完成传输 5,连接到一条IIC总线上的设备数量只受到最大电容400pF的限制 6,它是一个多主机系统,在一条总线上可以同时有多个主机存在,通过冲突检测方式和延时等待防止数据不被破坏。同一时间只能有一个主机占用总线 IIC总线在传输数据的过程中有3种类型的信号:开始信号、结束信号、和应答信号 >>开始信号(S): 当SCL为高电平时,SDA由高电平向低电平跳变,表示将要开始传输数据 >>结束信号(P):当SCL为高电平时,SDA由低电平向高电平跳变,表示结束传输数据 >>响应信号(ACK): 从机接收到8位数据后,在第9个周期,拉低SDA电平,表示已经收到数据。这个信号称为应答信号 开始信号和结束信号的波形如下图:

调试器工作原理探究系列第三篇

本文是调试器工作原理探究系列的第三篇,在阅读前请先确保已经读过本系列的第一和第二篇。 本篇主要内容 在本文中我将向大家解释关于调试器是如何在机器码中寻找C 函数以及变量的,以及调试器使用了何种数据能够在C源代码的行号和机器码中来回映射。 调试信息 现代的编译器在转换高级语言程序代码上做得十分出色,能够将源代码中漂亮的缩进、嵌套的控制结构以及任意类型的变量全都转化为一长串的比特流——这就是机器码。这么做的唯一目的就是希望程序能在目标CPU上尽可能快的运行。大多数的C代码都被转化为一些机器码指令。变量散落在各处——在栈空间里、在寄存器里,甚至完全被编译器优化掉。结构体和对象甚至在生成的目标代码中根本不存在——它们只不过是对内存缓冲区中偏移量的抽象化表示。 那么当你在某些函数的入口处设置断点时,调试器如何知道该在哪里停止目标进程的运行呢?当你希望查看一个变量的值时,调试器又是如何找到它并展示给你呢?答案就是——调试信息。 调试信息是在编译器生成机器码的时候一起产生的。它代表着可执行程序和源代码之间的关系。这个信息以预定义的格式进行编码,并同机器码一起存储。许多年以来,针对不同的平台和可执行文件,人们发明了许多这样的编码格式。由于本文的主要目的不是介绍这些格式的历史渊源,而是为您展示它们的工作原理,所以我们只介绍一

种最重要的格式,这就是DWARF。作为Linux以及其他类Unix平台上的ELF可执行文件的调试信息格式,如今的DWARF可以说是无处不在。 ELF文件中的DWARF格式 根据维基百科上的词条解释,DWARF是同ELF可执行文件格式一同设计出来的,尽管在理论上DWARF也能够嵌入到其它的对象文件格式中。 DWARF是一种复杂的格式,在多种体系结构和操作系统上经过多年的探索之后,人们才在之前的格式基础上创建了DWARF。它肯定是很复杂的,因为它解决了一个非常棘手的问题——为任意类型的高级语言和调试器之间提供调试信息,支持任意一种平台和应用程序二进制接口(ABI)。要完全解释清楚这个主题,本文就显得太微不足道了。说实话,我也不理解其中的所有角落。本文我将采取更加实践的方法,只介绍足量的DWARF相关知识,能够阐明实际工作中调试信息是如何发挥其作用的就可以了。 ELF文件中的调试段

董酒

董酒品牌介绍 ——贵州酒连网电子商务有限公司董酒,产于中国优质白酒核心区——贵州遵义,是中国老八大名酒,贵州省仅有的两大国家名酒之一。它是历代传承着中国传统文化深厚根基的民族瑰宝,是承袭中国数千年酿酒文化脉络的真正活化石,代表了中华民族千年沉淀的中医养生文化,它是中国白酒行业中极具中华民族特色的传统产品。 董酒,曾在全国第二、三、四、五届评酒会上四次蝉联“中国名酒”称号,并荣获国家金质奖章,其生产工艺和配方在当今世界上独一无二,在蒸馏酒行业中独树一帜,被国家权威部门永久列为“国家机密”。2008年8月由国家主管部门正式确定“董香型”白酒地方标准,而董酒则是国内“董香型”白酒的典型代表。 遵义酿酒历史十分悠久,据考古出土文物证明,早在旧石器时代,距今一、二十万年前,遵义一带就有人类劳动生息。董酒,秉承“药食同源”“酒药同源”人类酿酒起源的脉络,其酿造脉络可以追溯到远古时期,盛世于魏晋南北朝时期,具有亘古千年的历史。董酒正是传承了酒的根、中国白酒的真谛和酒文化的灵魂——“药食同源、酒药同源”,在制曲过程中加入130多种纯天然草本植物,酿造出风味独特的“本草之酒”、“百草之酒”。

贵董酒54度 此酒取富贵之意,表达对生活的美好祝愿与向往。董酒独特酿造配方源于道光年间,是建国后三次被列为“国家秘密技术”的中国传统八大名酒。是串香工艺的鼻祖,其独特工艺简称为“两小、两大、双醅串香”,经过分级陈酿,科学勾兑,形成特殊的董香风格——酒液清澈透明,香气幽雅舒适,入口醇和浓郁,饮后甘爽味长。 董酒,产于中国优质白酒核心区——贵州遵义,是中国老八大名酒,贵州省仅有的两大国家名酒之一。它是历代传承着中国传统文化深厚根基的民族瑰宝,是承袭中国数千年酿酒文化脉络的真正活化石,代表了中华民族千年沉淀的中医养生文化,它是中国白酒行业中极具中华民族特色的传统产品。 国密董酒 国密董酒,尽显尊贵气质,珍选自多年的陈香董基酒,由公司内享受国务院特殊津贴酿酒专家精心指导勾调而成,不仅承袭了董酒独有的风格,更被赋予了陈香、陈味的特色。董酒之传世秘方分“百草单”和“产香单”,前者制小曲,后者制大曲。以芳香类药群为主,补气、补血、滋阴类药群为辅。在制曲过程中,重要成分被微生物作用,生产过程中形成酸、酯、醇、酚、醛等四百多种微量成分,更使董酒成为具备养生功能的百草佳酿。晶莹剔透的玻璃瓶身辅以书法体阴刻

MSP430 IIC 程序驱动代码

/ 开发平台;MSP430 IIC总线驱动代码 本人试用过,可以成功的调通 /////////////////////////////////////////////////////////// //iic.c #include typedef unsigned char uchar; typedef unsigned int uint; #define SCL_H P1OUT |= BIT2 #define SCL_L P1OUT &= ~BIT2 #define SDA_H P1OUT |= BIT3 #define SDA_L P1OUT &= ~BIT3 #define SDA_in P1DIR &= ~BIT3 //SDA改成输入模式#define SDA_out P1DIR |= BIT3 //SDA变回输出模式#define SDA_val P1IN&BIT3 //SDA的位值 #define TRUE 1 #define FALSE 0 /******************************************* 函数名称:delay 功能:延时约15us的时间 参数:无 返回值:无 ********************************************/ void delay(void) { uchar i; for(i = 0;i < 15;i++) _NOP(); } /******************************************* 函数名称:start 功能:完成IIC的起始条件操作 参数:无 返回值:无 ********************************************/ void start(void) { SCL_H;

上海安达通信息公司产品手册

上海安达通信息公司产品手册 上海安达通信息安全技术(简称:ADT公司)于2002年1月在上海浦东国家信息安全产业化基地成立,专门从事VPN安全网关、身份认证产品的研发、生产和销售,要紧解决互联网和内联网的网络信息安全传输和接入身份认证等问题。公司是国家商用密码产品生产定点单位和销售定点单位。公司的要紧发起人差不多上中国信息安全界的精英,对VPN(虚拟专用网)、Firewall、AAA、IDS、PKI等技术领域都有着多年的实践体会和独到见解。 安达通安全网关产品凭借其领先的技术,能够实现任何IP网络环境下的VPN网络的互联和构建。目前公司拥有:融VPN和Firewall功能于一体的ADT安全网关SGW25系列6个型号产品和负载均衡SJW74系列4个型号产品,覆盖从“SOHO级-企业级-电信级”的全系列安全网关设备;支持Windows各平台的安全客户端软件;SSL VPN网关系列;功能完善的ADT安全网管平台,其中包括:策略服务平台、网关监控平台、数字证书平台;动态口令卡等系列网络安全产品。 通过多年来的奋斗,公司拥有一支由博士、硕士、学士组成的,层次合理、富有体会又极具开拓精神的队伍。用户更是遍布大江南北,在电子政务、电信、电力、金融、石化、企事业单位的用户数不胜数。安达通人始终以“为客户制造最大回报”为己任,孜孜不倦,全力解决好客户的每一个问题。您的中意,确实是我们最大的幸福! 产品简介 安全网关 安达通安全网关是集“VPN、防火墙、IDS微引擎和病毒过滤引擎”于一体的网络边界安全防护和安全接入设备,它有效地实现了“主/被动安全防备”的完美结合。其专门强大的VPN功能和高安全性、高性价比的多功能集成,是当今网络安全技术进展的主流方向。 安达通安全网关全部采纳嵌入式硬件平台和实时操作系统,高性能,低功耗,高可靠。产品线覆盖从“SOHO级-企业级-运营商级”全系列产品;安全网关集中治理和监控平台支持各种规模的安全网关组建的VPN网络的集中治理和监控。安达通突破了各种技术障碍,能够提供针对任何IP网络环境下的VPN互连、入侵防护和病毒防备的一体化解决方案。 安达通安全网关具有两大产品系列:1)支持单线路接入的SGW25安全网关系列;2)支

TI-I2C驱动

TI-I2C驱动 一、与I2C驱动相关的文件分成两部分: 1)应用层接口部分: 程序在svn中的路径如下: 在https://dareglob-971006/svn/eocOS/branches/eocOS_v4/branches/bsp/user/i2c目录下,i2ctest.c文件,提供了lm75a_temp_read()方法,用来读取LM75A设备温度寄存器中的温度信息的功能。 2)内核驱动部分: 内核位于svn中的路径如下: https://dareglob-971006/svn/eocOS/branches/eocOS_v4/branches/bsp/kernel (1)总线驱动: i2c-davinci.c:在内核目录中driver/i2c/busses目录下,适用于TI的I2C总线驱动程序。I2C总线驱动是对I2C硬件体系结构中适配器端的实现。 (2)I2C驱动代码核心: i2c-core.c:在内核目录中driver/i2c/目录下,是I2C代码的核心,用于沟通虚拟文件系统与底层实现。该文件提供了I2C总线驱动和设备驱动的注册、注销方法,I2C通信方法上层的、与具体适配器无关的代码以及探测设备、检测设备地址的上层代码等。 (3)I2C设备驱动: lm75.c:在内核目录中driver/hwmon目录下,是针对LM75A以及其他能兼容的温度传感器的设备驱动。I2C设备驱动是对I2C硬件体系结构中设备端的实现,设备一般挂接在受CPU控制的I2C适配器上,通过I2C适配器与CPU交换数据。二、I2C简要工作流程 1)在总线驱动初始化时候,当通过Linux内核源代码/driver/base/platform.c文件中定义platform_driver_register()函数注册platform_driver结构体时,其中probe指针指向的davinci_i2c_probe()函数将被调用,以初始化适配器硬件。 2)而davinci_i2c_remove()函数则完成与davinci_i2c_probe()相反的功能。用于内存和中断等系统资源的释放和注销。 3)总线驱动i2c-davinci.c中,定义了i2c_davinci_xfer函数。该函数是I2C总线通信传输函数。并且I2C适配器对应的i2c_algorithm结构体实例为i2c_davinci_algo,其中的master_xfer函数指针指向i2c_davinci_xfer函数。 4)当设备被打开,并且用户开始读操作时,会调用设备驱动lm75.c中show_temp()函数,该函数会调用i2c-core.c中的i2c_smbus_xfer()函数,i2c_smbus_xfer()函数会检查适配器对应的i2c_algorithm结构体中是否注册了smbus_xfer函数(目前i2c_davinci_algo中未注册smbus_xfer函数),程序会调用i2c_smbus_xfer_emulated()函数,最终,还是会调用标准的I2C总线通信函数master_xfer(),由于master_xfer 已经指向i2c_davinci_xfer函数,所以会调用总线驱动i2c-davinci.c中的i2c_davinci_xfer函数来读取信息。 三、接口函数 1)应用层接口: Int lm75a_temp_read(float *temp) 读取lm75a 温度 2)内核中:lm75.c文件 static ssize_t show_temp(struct device *dev, struct device_attribute *da,char *buf)

TI低功率SmartPA调试系列之一扬声器工作原理及软件

Application Notes 1 TI 低功率Smart PA 调试系列之一: 扬声器工作原理及软件调试入门 Anjin Du/Ding Wei/Xiangyan Xue 摘要 本系列汇集了关于TI 低功率Smart PA 的四篇应用笔记,分别从扬声器基础、软件调试、算法等方面介绍了TI 低功率Smart PA 技术。本文是这个系列的第一篇,主要介绍了扬声器的基础知识和工作原理,以及TI 低功率闭环Smart PA 器件的架构和调试入门,是后续文章的基础。 随后的系列应用笔记还包括《TI Smart PA 基础调音指南》、《TAS25xx Smart AMP Anti-Clipper 模块的音效调试》、《TI Smart PA 算法介绍》。 目录 1 扬声器工作原理及结构 (2) 1.1 电动式扬声器的工作原理: (2) 1.2 电动式扬声器的结构: (3) 1.3 扬声器的音质的评判 (6) 2 扬声器的主要参数 (6) 3 低功率Smart PA 的引入及其对扬声器性能的提升 (10) 3.1 传统应用中扬声器参数对其性能的限制 (10) 3.2 低功率Smart PA 的工作原理及其对扬声器性能的提升 (10) 4 PPC3 软件的使用以及喇叭参数的获取 (12) 4.1 PPC3(Pure Path Console 3)软件介绍 (12) 4.2 扬声器参数的建模提取 (13) 5 总结 .............................................................................................................................................. 15 6 参考资料 (15) 图 Figure 1电动式扬声器工作原理示意图 (3) Figure 2电动式扬声器结构框图 (4) Figure 3 扬声器的主要组成构件 (4) Figure 4 传统功放和低功率闭环Smart PA 功放的工作原理比较 (11) Figure 5 Smart PA 架构 (12) Figure 7 PPC3 典型界面 (13) Figure 8 扬声器参数提取的硬件环境 (14) Figure 9 Smart PA 参数界面 (15)

I2C 24CXX驱动程序(真正实用 全)

#define _24cXX_H /* Includes ----------------------------------------------------------------*/ #include "stm32f10x.h" #include "value.h" //#include "stdbool.h" /* Define ------------------------------------------------------------------*/ /* EEPROM Addresses defines */ //注:32 64 的字地址是16位2个字节如果使用32或64请简单修改驱动即可 #define WC24cXX 0x00 // 器件地址写#define RC24cXX 0x01 // 器件地址读 #define USE_24C08 //使用24C08 #ifdef USE_24C02 #define MAXSIZE24cXX 256 // 总容量Bytes //级联时请修改本参数和硬件驱动 #define BLOCK_SIZE 256 // 块容量Bytes #define I2C_PAGESIZE 8 // 8个字节每页 #endif #ifdef USE_24C04 #define MAXSIZE24cXX 512 // 总容量Bytes //级联时请修改本参数和硬件驱动 #define BLOCK_SIZE 256 // 块容量Bytes #define I2C_PAGESIZE 16 // 16个字节每页 #endif #ifdef USE_24C08 #define MAXSIZE24cXX 1024 // 总容量Bytes //级联时请修改本参数和硬件驱动 #define BLOCK_SIZE 256 // 块容量Bytes #define I2C_PAGESIZE 16 // 16个字节每页 /* user define */ #define YBCV_ADDR_0 0x0000 //定义仪表控制数据结构体的EEPROM存储地址0 #define YBCV_ADDR_1 0x0200 //定义仪表控制数据结构体的EEPROM存储地址1 #define EEPROM_VERIFY YB_CTRL_V ALE_SIZE //EEPROM仪表通道修正参数存储地址 #endif #ifdef USE_24C16 #define MAXSIZE24cXX 2048 // 总容量Bytes #define I2C_PAGESIZE 16 // 16个字节每页 #endif

山东渔翁信息PCI-E加密卡系列产品介绍

山东渔翁信息PCI-E加密卡系列产品介绍

渔翁信息PCI-E密码卡系列产品 1.产品概述 渔翁PCI-E密码卡系列产品是山东渔翁信息技术股份有限公司独立自主研发,在国内率先采用PCI-E总线技术的高速密码设备,遵循国家密码管理局关于PCI密码卡的相关技术规范,通过国家密码管理局鉴定,产品型号 SJK1120-A/B。 产品全面支持SM1/SM6、SM2、SM3、SM4等国密算法以及DES、3DES、AES、AES192、AES256、RSA、SHA1等多种国际标准算法,能够为各类安全平台提供多线程、多进程和多卡并行处理的高速密码运算服务,满足其对数字签名/验证、非对称/对称加解密、数据完整性校验、真随机数生成、密钥生成和管理等功能的要求,保证敏感数据的机密性、真实性、完整性和抗抵赖性。 产品支持Windows、Linux、FreeBSD等主流操作系统,提供符合《密码设备应用接口规范》要求的国家标准接口和国际通用标准接口,已广泛应用于签名验证服务器、IPSec/SSL VPN网关、防火墙等安全设备以及电子印章管理、安全公文传输等软件系统;产品符合《信息系统安全等级保护基本要求》三级及以上信息系统相关技术要求,市场前景广阔。 2.产品功能

3.产品特点 高安全性 ?采用经国家密码管理局审批的密码算法芯片 ?采用硬件真随机数芯片生成随机数,提高口令及各种密钥的质量 ?采用严格的密钥保护安全机制,卡内各级密钥不能被明文导出到 卡外 ?用户身份通过高安全性的智能密码钥匙进行识别 ?采用智能密码钥匙进行密钥和敏感信息的备份 高性能 ?密码卡主控芯片采用高性能DSP芯片,性能超过5000MIPS ?主机与密码卡之间数据传输采用高效DMA处理方式,减少主机CPU 占用率 ?密码算法采用专用ASIC算法芯片或FPGA硬件实现 高易用性 ?适用于PC机、服务器等多种硬件平台,支持PCI-E x1 ~ x16插槽?支持用户/内核态接口、国标接口及PKCS#11、微软CSP、JCE等国际标 准接口,同时可根据用户需求定制接口。

IIC驱动 IO模拟

QPSK STV0903 TUNER STV6110 驱动设计 1.IIC 理论 MEGA128 模拟IIC时序控制QPSK 中的STV0903 STV6110 STV0903 STV6110 连接图 IIC时序理论 先看下STV0903写时序图 1)起总线 先将SCL、SDA拉高,然后维持SCL为高先将SDA拉低参考代码如下:void Start(void) { SBI(PORTD,SAA7113_DA TA); SBI(PORTD,SAA7113_CLK); IIC_delay(); CBI(PORTD,SAA7113_DA TA); IIC_delay(); CBI(PORTD,SAA7113_CLK); IIC_delay(); } 2)停总线 先将SCL、SDA拉低,然后先拉高SCL,维持SCL为高时拉高SDA 参考代码:

void Stop(void) { CBI(PORTD,SAA7113_DA TA); CBI(PORTD,SAA7113_CLK); IIC_delay(); SBI(PORTD,SAA7113_CLK); IIC_delay(); SBI(PORTD,SAA7113_DA TA); IIC_delay(); } 3)写总线 在写总线时将SDA设置为输出,参考代码: void write_byte(unsigned char data) { uchar m,tmp; SBI(SAA7113_DDR,SAA7113_DA TA); for(m = 0; m < 8; m++) { if(data & 0x80) SBI(PORTD,SAA7113_DA TA); else CBI(PORTD,SAA7113_DA TA); IIC_delay(); SBI(PORTD,SAA7113_CLK); IIC_delay(); data = data<<1; CBI(PORTD,SAA7113_CLK); } IIC_delay(); saa7113_ack(); IIC_delay(); } 4)应答 应答由被控制芯片回应过来,在此时SDA应该设置为输入等待ACK, 在CLK第九个脉冲时,CLK为高电平,而SDA为一个低电平在表示收到器件的一个ACK应答。。 参考代码: void saa7113_ack() { uchar tmp,m; CBI(DDRD,SAA7113_DA TA); SBI(PORTD,SAA7113_CLK); for(m=0;m<10;m++) {

ChinaPay代扣产品手册

代扣产品手册 文档属性 版本历史: 版本号修改内容编撰者发布日期 1.0 文档创建郭磊2010-05-14 版权声明: 此文档的版权归银联电子支付服务有限公司所有,作为本方案的最终用户,可以拥有该份文档的使用权,但未征得银联电子支付服务有限公司的书面批准,不得向第三方借阅、出让、出版该文档。

目录

1.1功能介绍 银联电子支付服务有限公司(简称ChinaPay 或CP)代扣产品基于ChinaPay 代扣平台和各商业银行的账户扣款系统,为合作商户的费用收缴等活动提供用户银行账户支付和资金结算服务。 1.1.1交易功能 商户通过联机接口和文件上传两种交易方式,将扣款账号、扣款金额等信息按照约定格式提交ChinaPay,ChinaPay代扣平台传递代扣交易信息至相应的商业银行进行实时划扣处理。 1.1.2查询功能 1)交易查询:商户可通过联机或登录控台两种方式,按照交易日期、批次和交易状态等选项查询代扣交易信息; 2)交易报表的生成及显示:商户可按指定日期段生成并显示相关交易报表; 3)交易明细下载:商户可下载其任一天或几天交易明细。 1.1.3结算功能 按照及商户约定的结算周期为商户结算交易款项,自动处理结算及退款信息。 1.1.4个性化功能 度身设计支付结算方案,适用于各种电子商务代扣业务;针对不同需求可采用不同的业务实现方式。

1.2.1一站式 通过ChinaPay代扣平台一次性连接多家商业银行,实现跨行、跨区实时代扣;通过ChinaPay获得统一、及时的资金结算服务。 1.2.2实时性 相对于传统批扣业务,实时划扣业务有着扣账周期短、到账速度快的特点。 1.2.3覆盖广 支持主要商业银行发行的各类银行借记卡,是目前支持银行数量最多的代扣平台。 1.2.4个性化 针对总、分公司等不同业务模式,度身设计支付结算方案。 1.2.5全天候 支持7*24小时交易和服务。 1.3支持银行 目前支持工商银行、建设银行、农业银行、邮储银行、招商银行、民生银行、中信银行、广发银行、浦发银行、兴业银行、交通、平安、深发等13家大型商业银行全国范围的借记卡代扣。ChinaPay将不断扩展代扣范围,深化在代扣业务上的竞争优势。

I2C_周立功标准驱动程序_c代码

I2C_周立功标准驱动程序_c代码 1. /****************************************Copyright (c)************************************************** 2. ** 广州周立功单片机发展有限公司 3. ** 研究所 4. ** 产品一部 5. ** 6. ** 7. ** 8. **--------------文件信息-------------------------------------------------------------------------------- 9. **文件名: I2c.c 10. **创建人: 陈明计 11. **最后修改日期: 2003年7月21日 12. **描述: μCOS-II下LPC210x的I2c主模式底层驱动 13. ** 14. **--------------历史版本信息---------------------------------------------------------------------------- 15. ** 创建人: 陈明计 16. ** 版本: v1.0 17. ** 日期: 2003年7月8日 18. ** 描述: 原始版本 19. ** 20. **------------------------------------------------------------------------------------------------------ 21. ** 修改人: 陈明计 22. ** 版本: v1.1

微机原理实验一调试程序的使用

物理与机电工程系 (2015——2016 学年第一学期) 《调试程序的使用》 上机实验报告 专业:电子信息科学与技术 学号: 1524812252 姓名:刷卡机 任课教师:风机房 实验地点:理工实验楼9007 项目编号:实验一

执行R命令,即查看、修改CPU寄存器的内容,此时执行结果为: AX =0000 DS=1420 BX=0000 SS=1420 CX=0000 CS=1420 DX=0000 ES=1420 执行D命令,即显示存储单元中的内容命令,此时执行结果为:1420:0100 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 1420:0110 00 00 00 00 00 00 00 00-00 00 00 00 34 00 0F 14 ................ 1420:0120 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 1420:0130 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................

-T AX=EE9A BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=1420 ES=1420 SS=1420 CS=1420 IP=0129 NV UP EI NG NZ AC PE NC 1420 : 0129 0000 ADD [BX+SI] , AL DS:0000=D1 这是第一条指令执行后的结果和各寄存器内的存储变化码以及其机器显示,此时的标志位为NV UP EI NG NZ AC PE NC 即 溢出标志OF=0 不溢出方向标志DF=0增) 中断标志IF=1开中断符号标志SF=1为负 零标志ZF=0为非零辅助进位AF=1辅助有进位

51单片机I2C总线驱动程序

51单片机I2C总线驱动程序 SI2I2C 总线是PHLIPS 公司推出的一种串行总线,是具备多主机系统所需 的包括总线裁决和高低速器件同步功能的高性能串行总线。I2C 总线只有两根 双向信号线。一根是数据线SDA,另一根是时钟线SCL。 一.I2C 系统结构每个接到I2C 总线上的器件都有唯一的地址。主机与其它器 件间的数据传送可以是由主机发送数据到其它器件,这时主机即为发送器。由 总线上接收数据的器件则为接收器。 二.数据位的有效性规定I2C 总线进行数据传送时,时钟信号为高电平期间, 数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线 上的高电平或低电平状态才允许变化。 三.字节传送与应答每一个字节必须保证是8 位长度。数据传送时,先传送最 高位(MSB),每一个被传送的字节后面都必须跟随一位应答位(即一帧共有 9 位)。 四.驱动程序#define uchar unsigned char#define uint unsigned int#define somenop() _nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_()sbit SCL=P2;sb it SDA=P2;123451.起始信号和终止信号 SCL 线为高电平期间,SDA 线由高电平向低电平的变化表示起始信号;SCL 线为高电平期间,SDA 线由低电平向高电平的变化表示终止信号。 起始和终止信号都是由主机发出的,在起始信号产生后,总线就处于被占用 的状态;在终止信号产生后,总线就处于空闲状态 void I2C_Start() //起始{SCL=1;somenop();SDA=1;somenop(); SDA=0;somenop();SCL=0;somenop();}void I2C_Stop() //终止{ SDA=0;somenop();SCL=1;somenop();SDA=1;somenop();}12345678910111213141

国密高安全门禁--CPU卡

国密CPU卡高安全门禁产品 技术方案 光电安辰信息安全

目录 1 概述 (1) 1.1 背景 (1) 1.2 产品定位 (2) 1.3 CPU卡与ID卡区别 (3) 1.4 CPU卡安全性优势 (3) 1.5 CPU卡系统与ID卡系统比较 (2) 2 产品组成与功能 (4) 2.1 国密CPU卡 (5) 2.2 国密CPU卡发卡器 (6) 2.3 国密CPU卡安全门禁读卡器 (7) 2.4 国密门禁控制器 (8) 2.5 国密CPU卡门禁密钥管理系统 (9) 2.5.1 密钥生成和管理 (10) 2.5.2 卡片初始化 (10) 2.5.3 发卡 (10) 2.6 国密门禁管理软件 (10) 2.6.1 功能管理结构模式 (10) 2.6.2 门禁管理软件主要功能 (11) 3 产品技术优势 (11) 4 应用范围 (12) 5 应用案例 (12)

1概述 1.1背景 目前我国80%的门禁产品均是采用原始IC卡的UID号或ID卡的ID号去做门禁卡,没有去进行加密认证或开发专用的密钥,其安全隐患远比Mifare卡的破解更危险,非法破解的人士只需采用专业的技术手段就可以完成破解过程。导致目前国内大多数门禁产品都不具备安全性原因之一,是因为早期门禁产品的设计理论是从国外引进过来的,国内大部分厂家长期以来延用国外做法,采用ID 和IC卡的只读特性进行身份识别使用,很少关注卡片与门禁机具间的加密认证,缺少安全密钥体系的设计,而ID卡是很容易可复制的载体,导致此类门禁很容易在极短时间内被破解和复制。 2009年国家密码管理局印发了《重要门禁系统密码应用指南》,提出重要门禁系统中使用的所有密码设备都要通过国家密码管理局审批,对新建和改造重要非接触IC卡门禁系统安全提出了更高要求。 1.2产品定位 有效防范门禁产品安全问题的根本解决方案就是升级改造现有ID卡或逻辑加密卡门禁机具及卡片,并逐步将ID或逻辑加密卡门禁产品替换为更为安全可靠的CPU卡安全门禁产品。 为了解决门禁系统安全性问题,天津光电安辰信息技术有限公司基于自主国产知识产权的国密CPU卡、国密CPU卡读写设备、国密CPU卡COS系统及国密CPU卡密钥管理系统等,推出了国密CPU卡安全门禁系列产品。 1.3CPU卡与ID卡区别 ID卡:全称为身份识别卡(Identification Card),是一种不可写入的感应卡,含固定的编号,主要有台湾SYRIS的EM格式、美国HIDMOTOROLA等各类ID卡。ID卡仅使用了“卡的号码”,卡内除了卡号外,无任何保密功能,其“卡号”是公开、裸露的。 CPU卡:也称智能卡,卡内的集成电路中带有微处理器CPU、存储单元(包括

IIC总线驱动

题目:I2C总线驱动 一、设计目的 1、理解IIC总线协议的内容。 2、根据IIC协议编制驱动程序,使用LED数码管显示24LC02某地址存储的 数据。 3、有按键,可设置存储的数据。 二、设计要求 1、根据IIC协议编制驱动程序,使用LED数码管显示24LC02某地址存储的数据。 2、有按键,可设置存储的数据。 三、方案设计与论证 I2C总线特征 I2C串行总线一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL。所有接到I2C总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上。 图1IIC总线规范

I2C总线起始与停止条件 I2C总线在传送数据过程中信号类型: 开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。 结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。 图2 起始和停止条件 I2C总线的数据传输 每一个字节必须保证是8位长度,每次传输可发送的字节数量不受限制。数据传送时,先传送最高位(MSB),每一个被传送的字节后面都必须跟随一位应答位(即一帧共有9位)。 图3 数据传输时序图

AT24C02简介 AT24C02是美国ATMEL公司的低功耗CMOS串行EEPROM,它是内含256 ×8位存储空间,具有工作电压宽(2.5~5.5V)、擦写次数多(大于10000次)、写入速度快(小于10ms)等特点。AT24C02中带有片内寻址寄存器。每写入或读出一个数据字节后,该地址寄存器自动加1,以实现对下一个存储单元的操作。所有字节都以单一操作方式读取。为降低总的写入时间,一次操作可写入多达8字节的数据。图6为AT24C系列芯片的封装图。各引脚功能如下: 图4 A T24C02及其外围电路 SCL:串行时钟。在该引脚的上升沿时,系统将数据输入到每个EEPROM器件,在下降沿时输出。 SDA:串行数据。该引脚为开漏极驱动,可双向传送数据。 A0、A1、A2:器件/页面寻址。为器件地址输入端。 WP:硬件写保护。当该引脚为高电平时禁止写入,当为低电平时可正常读写数据。VCC:电源。一般输入+5V电压。 VSS:接地。 I2C总线驱动 I2C 总线驱动主要包括I2C 适配器结构i2c_adapter 和I2C 适配器的algorithm 数据结构。 通过I2C 总线驱动的代码,可控制I2C 适配器以主控方式产生开始位、停止

调节器的工作原理与调试方法

调节器的工作原理与调试方法 一、结构组成 1、采用标准嵌入式结构系统 2、由自动通道与模拟通道构成 3、自动通道由输入板、双CPU板、输出板组成 4、模拟(手动)通道独立工作板 二、作用 1、调节输入板 该板主要用于遥测、遥信输入,遥测信号主要采集定子电流、系统电压、机端电压、励磁电压、励磁电流,通过霍尔传感器变换后送到CPU进行处理;遥信主要采集开机令、停机令、灭磁开关位置、油开关位置、整流故障、停风等信号通过光电隔离后再送到CPU板。 2、CPU板 两块电路板共享模拟信号,互相监视,互为热备用,即两套微机板都在线工作,当一台出现故障,则立即切换到另一台微机运行,切换无扰动。 由PT、CT、励磁电压、励磁电流等送来的模拟及数字信号,先进行隔离变换,再送到微机板,在双微机系统中,每块微机板都得到相同的输入信号,进行同样的运算处理。其输出信号采取封门的方式由逻辑电路自动进行切换。微机的输出信号经过隔离放大后去推动执行器件。 3、输出板 主要功能是通过同步变压器实时跟踪励磁变压器副边的同步信号,根据调节器的控制信号输出六路脉冲,控制三相全控整流桥的输出,同时也具有完善的控制、逻辑、限制、保护和接口等功能。 4、手动模拟调节输出板 此模拟通道作为后备用,它与主控通道独立,按励磁电流闭环控制方式调节。 该板能通过调节增、减磁按钮进行独立调节励磁电流,在一般情况下均由微机自动完成调节任务。

三、调试方法 1、输入板: 可调节P1(机端电压)、P2(系统电压)、P4(励磁电流);以上调节均在并网前调节。 方法: (1)、起励后在恒流位置时调节P1即机端电压,使数码显示中的A0000与实际电压一致,如机端电压此时为6000V时数显应调节为A6000。 (2)、在恒压位置时调节P4即励磁电流,使数码显示的D0000与实际电流一致,如并网前的励磁电流为100A时数显应调节为D0100。 (3)、P2在恒压、恒流时均可调,即调节P2使数显C与当前的系统电压一致即可。 2、CPU板 调节W1使模拟量工作电源(VREF)为5V 按键说明: K1-----切换键 K3-----增Ukp值 K4-----减Ukp值 K5-----增Ikp值 K6-----减Ikp值 K7-----置位 3、手动板 在手动板工作时,调节P1可以改变机端电压限制值。 调节P2使U4(芯片LM308)的输入、输出的IK绝对值应相等;调节P3使U11(芯片LM308)的输入、输出的UK绝对值应相等。 四、显示板的按键机显示功能 1、S1、S2为数显功能切换键,S3为恒压/恒流切换键,S4为自动/ 手动切换键。 2、数显功能 A 机端电压 B 给定电压 C 系统电压 D 励磁电流 E 励磁电流给定 F UKP值 G UKI值 H IKP值 I IKI值

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