MCU控制HT93LC46的读写
93LC46
无
128 x 16 位
无
I, E P, SN, ST, MS, OT, MC
93LC56C
2
2.5-5.5
有
可选 x8 或 x16
无
I, E P, SN, ST, MS, MC
93C56A
2
4.5-5.5
无
256 x 8 位
无
I, E P, SN, ST, MS, OT, MC
93C56B
2
4.5-5.5
2048 x 8 位 1024 x 16 位 可选 x8 或 x16 2048 x 8 位 1024 x 16 位 可选 x8 或 x16 2048 x 8 位 1024 x 16 位 可选 x8 或 x16
PE 引脚 温度范围
封装
无
I
OT
无
I
OT
有
I
P, SN, ST, MS, MC
无
I, E OT
架构 (字)
PE 引脚 温度范围
封装
93XX46A/B/C
93AA46A
1
1.8-5.5
无
128 x 8 位
无
I
P, SN, ST, MS, OT, MC
93AA46B
1
1.8-5.5
无
64 x 16 位
无
I
P, SN, ST, MS, OT, MC
93AA46C
1
1.8-5.5
有
可选 x8 或 x16
64 x 16 位
无
I, E P, SN, ST, MS, OT, MC
93LC46CX
1
2.5-5.5
有
可选 x8 或 x16
MCU内置LCD控制驱动器工作原理
随着智能化的普及,现在很多应用场景下可能需要使用段码式液晶显示屏L C D,如:家用电器、工业设备、仪器仪表、楼宇自动化设备、医用仪器、穿戴设备等等。
这不仅是因为段码式液晶显示屏L C D具有显示美观、成本优势、功耗低等优点,而且现在很多MC U都集成了L C D驱动模块,使得开发变得更容易。
今天我们结合瑞萨M C U给大家讲述一下M C U内置L C D控制/驱动器工作原理。
段码式液晶显示屏LC D结构和显示原理段码式液晶显示屏LC D内部晶体在静电场的功效下,晶体的排列方向会发生偏转,因而改变其透光性,从而可以看到显示的内容。
L C D有一个偏转阀值,当L C D两端的电压高于该阀值时,则显示内容;而低于该阀值时,则不显示。
一般段码式液晶显示屏L C D有三个主要参数:工作中电压、D u t y (相匹配C O M数)和B I A S(偏压,相匹配阀值),例如,3.0V、1/4D u t y、1/3B I A S表明L C D的工作中电压为3.0V,有4个C O M,阀值大概是1.1V (3.0/3=1.0)。
当加在某段L C D两端的电压大于 1.0V时显示,反之,不显示。
但是,L C D对于驱动电压的反应不是很明显,例如加 1.0V电压的时候,可能会微弱显示,这就是通常说的“鬼影”。
因此,要保证驱动L C D 显示的时候,加在L C D两端的电压要比阀值电压大得比较多,而不显示的时候,则要比阀值电压小得比较多。
需要注意的是,L C D的两端是不能加直流电压的,否则时间稍长会危害段码式液晶显示屏L C D晶体分子结构的电化学特点,造成显示实际效果模糊不清,使用期限降低的不良影响,其毁灭性不能修复,这就要求保证加在L C D两端的驱动电压的平均电压为0。
所以,L C D 使用分割扫描法,在任何时候只有一个C O M扫描有效,其余的C O M 处于无效状态。
一个好的段码式液晶显示屏L C D控制器/驱动器,应该满足:•能提供不同数量的COM、Duty(相匹配COM数)和BIAS(偏压,相匹配阀值),满足不同规格LCD屏的驱动•能够提供多种分压方式,提供内部分压,减少外围电路分压的元器件•能够提供内部Boost升压,满足一些电池供电,电池电压下降时,亮度还可以保持•能够提供内部基准电压稳压,避免分压不准导致显示出现“鬼影”•能够提供多个不同的基准电压选择,可以调整对比度•能够提供多种不同分割扫描法、驱动波形,满足灵活选择•能够不同的时钟源和不同分割扫描帧率的选择,满足不同应用低功耗的要求瑞萨M C U内置的L C D控制器/驱动器不但满足上面的规格,而且还提供其他优点功能:•提供不同的时钟源选择,可选择外部副时钟32.768KHz,也可选择MCU内部低速或高速时钟•提供显示数据寄存器,能通过自动读取显示数据寄存器进行段信号SEG和公共信号COM的自动输出•提供时间间隔闪烁功能,方便易用瑞萨MC U内置的LC D控制器/驱动器1LCD控制器/驱动器框图图1为集成到瑞萨自有16bits RL78系列核MCU中的LCD控制器/驱动器,图2集成瑞萨32bits RA4M1系列Arm核MCU中的LCD控制器/驱动器,两者主要区别是LCD 控制器/驱动器的工作时钟选择不同,RA4M1系列还可支持选择内部高速时钟。
HDLTEK ht49 mcu控制ht93lc46的读写 说明书
HT49 MCU 控制 HT93LC46 的讀寫
文件編碼:HA0044T
簡介
HT93LC46 EEPROM 是 Holtek 製造的 1K 位元系列的 EEPROM(電子可擦除式唯讀記憶體), 一般它用於微控制器的固定資料的儲存。在本文中,我們將以 Holtek 公司八位元微控制器 HT49 系列爲例,介紹該晶片常用的操作功能代碼。用戶只需把代碼加到程式中,並且在使 用 HT93LC46 之前將引腳 CS/SK/DI/DO 連接即可。
功能說明
在本文中將用到一個插入文件 HT93LC46S.ASM 和一彙編原始檔案 OP16_93LC46S.ASM。在 HT-IDE3000 開發環境下,在使用所提供的介面函數前按下述的操作步驟: 步驟 1:把 OP16_93LC46S.ASM 加到專案下(用[Project/Edit]指令)。 步驟 2:根據你的電路,修改 HT93LC46S.INC 文件連接 CS/SK/DI/DO 引腳。 步驟 3:包括 HT93LC46.ASM 在內的原始檔案呼叫介面函數。 註:在使用這些函數前要適當地設置輸入/輸出口的模式。
mov a, 04bh
mov data2, a
mov a, 0c3h
mov data3, a
call ht93lc46_wral
;ht93lc46 寫全部空間
nop
mov a,3fh
;ORG 腳接 VCC,64x16
mov temp,a
read_2:
clr data2
clr data3
mov a, temp
data3 db ?
porta equ
[70h]
sk
HT1380的读写控制
HT1380的读写控制文件编码:HA0049sHT1380/HT1381是一款用硬件来实现日历及时钟功能的标准品,在与其它MCU配套使用时外部只需挂一颗32K的晶振。
用户使用时只需将初始时间日期写入其相应的寄存器内即可,随后从HT1380/HT1381内读出的数据即为当前时间日期值。
它精度高,而且应用非常简单方便。
DRIVER的使用说明:一,driver的使用针对HT1380的读写,共提供了二个driver,实现对HT1380进行读出和写入的功能。
使用时将该子程序中要用到的变量加入到你的定义中,将汇编源文件rw_ht1380.asm加入到你的程序中即可。
要修改I/O的定义可以直接在 .section‘data’中修改equ的定义。
二,各个driver的详细说明1,driver名称: READ_1380实现功能:从HT1380中读出一个数据入口参数:none出口参数:acc中间变量:time_temp, time_count堆栈使用:无2,driver名称: WRITE_1380实现功能:向HT1380中写入一个数据入口参数:acc出口参数:none中间变量:time_temp, time_count堆栈使用:无#include ht48r10a-1.incrw_ht1380_data .section 'data'?time_temp db?dbtime_countequpa.4ht1380_clkpac.4ht1380_clk_ctrl equpa.5ht1380_io equht1380_io_ctrl equ pac.5ht1380_restpa.6equpac.6ht1380_rest_ctrl equrw_ht1380_code1 .section ‘code’;==================================================================== read_ht1380:time_tempclra,8movtime_count,amovht1380_io_ctrlsetread_ht1380_loop:cclrsetht1380_clkht1380_ioszcsettime_temprrcht1380_clkclrtime_countsdzjmpread_ht1380_loopa,time_tempmovret;==================================================================== write_ht1380:mov time_temp,amov a,8mov time_count,aclr ht1380_io_ctrlclr ht1380_iowrite_ht1380_loop:rrc time_tempsz cset ht1380_ioset ht1380_clknopclr ht1380_clkclr ht1380_iosdz time_countjmp write_ht1380_loopret硬件电路图如下:下面用实例来说明该怎样使用此driver程序。
PCI9054详细资料
本文介绍近期工程用到了CPCI,便上网搜集了一下PCI的资料,CPCI是PCI的子集,所用桥接芯片分主从两种,在此不赘述了。
至于PCI,本人整理介绍如下:随着Windows图形用户界面的迅速发展,以及多媒体技术的广泛应用,要求系统具有高速图形处理和I/O吞吐能力,这使原有的ISA、EISA总线远远不能适应而成为整个系统的主要瓶颈。
为此,1991年下半年,Intel公司首先提出PCI概念,并联合IBM、Compaq、AST、HP Apple、NCR、DEC 等100多家公司共谋计算机总线发展大业,成立了PCI集团。
PCI:Peripheral Component Interconnect,外围设备互联总线,是一种局部总线,已成为局部总线的新标准,广泛用于当前高档微机、工作站,以及便携式微机。
主要用于连接显示卡、网卡、声卡。
PCI总线是32位同步复用总线。
其地址和数据线引脚是AD31~AD0。
PCI的工作频率为33MHz。
一PCI总线特性1.PCI总线特点(1)传输速率高最大数据传输率为132MB/s,当数据宽度升级到64位,数据传输率可达264MB/s。
这是其他总线难以比拟的。
它大大缓解了数据I/O瓶颈,使高性能CPU的功能得以充分发挥,适应高速设备数据传输的需要。
(2)多总线共存采用PCI总线可在一个系统中让多种总线共存,容纳不同速度的设备一起工作。
通过HOST-PCI桥接组件芯片,使CPU总线和PCI总线桥接;通过PCI-ISA/EISA 桥接组件芯片,将PCI总线与ISA/EISA总线桥接,构成一个分层次的多总线系统。
高速设备从ISA/EISA总线卸下来,移到PCI总线上,低速设备仍可挂在ISA/EISA总线上,继承原有资源,扩大了系统的兼容性。
(3)独立于CPU PCI总线不依附于某一具体处理器,即PCI总线支持多种处理器及将来发展的新处理器,在更改处理器品种时,更换相应的桥接组件即可。
(4)自动识别与配置外设用户使用方便。
关于调试93C46的读写出现的问题
#defineDIO_STATE_InTRISB4=1
#defineDIO_STATE_OutTRISB4=0
//写93c46操作码和地址函数(8位数据存储结构):
void Write93c46OpcAndAddr(Uint8 opcode,Uint8 addr)
{
DIO=(wdata&0x80)?1:0;//逐位写入
CLK=0;//产生时钟
asm("nop");
asm("nop");
asm("nop");
asm("nop");
CLK=1;
wdata<<=1;//取下一位
}
CS=0;//选通禁止
Delay10us(1);
}
//93C46写使能函数:
void WriteEnable93C46(void)
{
if(FLAG_10MS)
{
FLAG_10MS=0;
//led=1;
// eeprombuf[0]=Read93c46Data(0x05);
// eeprombuf[1]=Read93c46Data(0x05);
// eeprombuf[2]=Read93c46Data(0x06);
if(eeprombuf[0]==0x95&&eeprombuf[1]==0x20&&eeprombuf[2]==0x30) led=1;
93C46为容量1K的EE2PROM,工作电压为REDA: 2~5.5V WRITE: 2.4~5.5V,通过3线的SPI接口来进行读取,管脚排布如下图
93C46演示程序(SPI总线接口)
实验13:93C46演示程序(SPI总线接口)相关搜索:SPI, 总线, 接口, 演示, 程序本帖最后由阿南于 2009-7-29 20:38 编辑实验13:93C46演示程序(SPI总线接口)93c46 是1k 位串行EEPROM 储存器。
每一个储存器都可以通过DI/DO 引脚写入或读出。
它的存储容量为1024 位,内部为128×8 位或64×16 位。
93C46 为串行三线SPI 操作芯片,在时钟时序的同步下接收数据口的指令。
指令码为9 位十进制码,具有7 个指令,读、擦写使能、擦除、写、全擦、全写及擦除禁止。
该芯片擦写时间快,有擦写使能保护,可靠性高,擦写次数可达100 万次,以下给出了93C46 与单片机的接线图,和引脚说明。
93C46串行EEPROM指令格式选择指令起始位操作数地址数据64X16 128X8 64X16128X8读(READ) 1 10 A5-A0 A6-A0清除(ERASE) 1 11 A5-A0 A6-A0写(WRITE) 1 01 A5-A0 A6-A0D15-D0 D7-D0写使能(EWEN) 1 00 11XXXX 11XXXXX写禁止(EWDS) 1 00 00XXXX 00XXXXX芯片清除(ERAL) 1 00 10XXXX 10XXXXX芯片写入(WRAL) 1 00 01XXXX 01XXXXXD15-D0 D7-D0说明:1.读(READ):当下达10XXXXXX指令后,将使地址(XXXXXX)的数据在SK=HI时由DO输出。
2.写(WRITE):在写入数据前,必须先下达写使能(EWEN)指令,然后在下达01XXXXXX指令后,当SK=HI时,会把数据码写入指定的地址(XXXXXX),而DO=0时,表示还在进行烧写,烧写完成后,DO会转为HI,写入动作完成后,必须再下达写禁止(EWDS)指令。
3.清除(ERASE):下达清除指令11XXXXXX,会将地址(XXXXXX)的数据清楚。
HT46R48
M
U
X
D ATA M e m o ry
In s tr u c tio n D ecoder
T im in g G e n e ra to r
O SC2
O SC1
RES VDD VSS
M UX
A LU S h ifte r
STATU S P A 3,P A 5
ACC
LV R
TM R C TM R
M
P r e s c a le r
引脚说明
引脚名称 PA0~PA2 PA3/PFD PA4/TMR PA5/ INT PA6,PA7
PB0/AN0 PB1/AN1 PB2/AN2 SCL/PB3 PB4~PB7
PC0 PC1
PD0/PWM
RES VDD VSS
OSC1 OSC2
输入/输出
输入/输出
输入/输出
输入/输出
输入/输出 输入 — — 输入 输出
Rev. 1.20
2
2006-05-30
方框图
P A 5 /IN T
HT46R48
P ro g ra m ROM
P ro g ra m C o u n te r
STAC K
In te rru p t C ir c u it
IN T C
In s tr u c tio n R e g is te r
MP
PBC
P o rt B
PB
PAC
P o rt A
PA
P B 0 /A N 0 ~ P B 3 /A N 3 P B 4~P B 7
P A 0~P A 2 P A 3 /P F D P A 4 /T M R P A 5 /IN T P A 6~P A 7
用单片机实现SPI接口存储器数据编程设计
微 处 理 机M I CROPROCESS ORS・大规模集成电路设计、制造与应用・用单片机实现SP I接口存储器数据编程设计3李伟光,王元聪(广州华南理工大学机械工程学院,广州510640) 摘 要:提出了用AT89C51/52对SP I接口存储芯片进行数据编程的软硬件结构设计,讨论了数据编程原理及实现方法,并对编程调试进行了改进和总结。
关键词:SP I接口;MCU;双字;编程;串行EEPROM中图分类号:TP274 文献标识码:A 文章编号:1002-2279(2007)02-0004-04 The D e s i gn o f da ta P ro g ramm i ng o n S P I I n te rface M em o ri ze r w ith MCUL IW ei-guang,WANG Yuan-cong(South China U niversity of Technology,Guangzhou510640) Abstract:This paper has discussed the data p r ogra m p rinci p le and design of SP I interface me mory chi p based on the AT89C51/52,and als o i m p r oved and summarized the debugging method.Key words:SP I I nterface;MCU;Double Words;Pr ogra m;Serial EEPROM1 引 言随着自动化及控制技术的高速发展,越来越多的公司致力于研发基于PC I总线的即插即用功能板卡,如PC I数据采集卡、基于PC I总线的运动控制卡、PC I通讯板卡、I/O板卡等,这些功能板卡在选择串行EEPROM时,大多采用台湾HOTEK公司的SP I 接口串行EEPROM芯片HT93LC46,用以存储板卡固定的PC I配置空间信息。
自己写的93c46程序
sbit dout=P1^3; //数据输出脚
/**********声明函数****************/
sendbit(unsigned char i,unsigned char sendadress);//
//向93CXX发送开始位和指令,地址
sk=0;
}
}
/********* 一位一位接收数据函数 *************/
recebit()
{
unsigned char j;
unsigned char recedata;
for(j=0;j<8;j++)
{
recedata<<=1; //先左移以位,否则数据最后一位不对(为位0)
{
cs=0;
sk=0;
din=0;
_nop_();
cs=1;
_nop_();
sendbit(3,0x70);//发送清除指令
sendbit(7,cadress);//发送清除地址
cs=0;
_nop_();
cs=1;
while(!dout); //检测清除结束了没有
cs=1;
while(dout==0); //检测数据写完了没有
cs=0; //写数据结束
din=1;
delay(10); //等待硬件写完数据
}
/********* 清除某单元数据函数 *************/
clearbye(unsigned char cadress)
senddata(unsigned char send_data);//向93CXX发送数据
93C46串行EEPROM数据读写实验
93C46串行EEPROM 数据读写实验一、实验目的1.学会93C46的操作指令,掌握93C46读/写程序的编写2.掌握93C46与单片机的接口方式 二、实验说明93C46/56/66是1K/2K/4K 位的串行电可擦写的EPROM 。
93C46的1K 位EPROM ,可以按128字节排列,也可以64字节排列。
93C46芯片有8脚,当ORG 接VCC 时作64字使用。
当ORG 接地时作128字节使用。
本实验使用单片机P1口的低4位对93C46进行控制,当然也可以使用其他I/O 口。
CS 是片选端,高电平有效,CLK 是移位脉冲输入端,DI 是数据输入端,D0是数据位输出端。
ORG 接5V ,93C46作64个字使用。
如图:93C46指令表 本实验提供93C46的读写操作软件,有5条主要的命令:READ 、WRITE 、WRAL 、ERASE 和ERAL 。
其中EWEN (写允许)和EWDS (写禁止)操作命令已经包含在写入命令和擦除命令当中了。
程序中寄存器R7用来指定93C46的地址,R6、R5分别用来存放待操作数据的高低字节。
对主程序操作只要在调用子程序之前把相应的内容写进R7、R6、R5中就可以了。
三、实验内容及步骤本实验需要用到单片机最小应用系统CPU 模块(F1区)、串行EEPROM 模块(E1区)。
1.用单片机最小应用系统和93C46串行接口模块,用导线连接P1.0到CS ,P1.1到CLK ,P1.2到DIN ,P1.3到D0UT ,ORG 与+5V 电源相接。
2.用串行数据通信线连接计算机与仿真器,把仿真器插到模块的锁紧插座中,请注意仿真器的方向:缺口朝上。
3.打开Keil uVision2仿真软件,首先建立本实验的项目文件,接着添加TH18_93C46.ASM 源程序,进行编译,直到编译无误。
4.进行软件设置,选择硬件仿真,选择串行口,设置波特率为38400。
5.打开93C46.ASM 源程序,编译无误后按MAIN 程序要求设置断点执行程序,打开CPU 窗口(寄存器窗口),查看寄存器R7、R6、R5的值。
93c46单片机c51读写程序
93c46读写程序://已验证可行/*------------------------------------------------------------------------------HELLO.CCopyright 1995-1999 Keil Software, Inc.------------------------------------------------------------------------------*/#include <REG52.H> /* special function registerdeclarations *//* for the intended 8051 derivative */#include <stdio.h> /* prototype declarations for I/Ofunctions */#ifdef MONITOR51 /* Debugging with Monitor-51needs */char code reserve [3] _at_ 0x23; /* space for serial interruptif */#endif /* Stop Exection with SerialIntr. *//* is enabled */#define uchar unsigned char#define uint unsigned intunsigned char codenum[10]={0x18,0x7b,0x2c,0x29,0x4b,0x89,0x88,0x3b,0x08,0x09};// 显示段码值0~9unsigned char code xuanze[4]={0x7f,0xbf,0xdf,0xef};sbit dp0= P2^7;sbit dp1= P2^6;sbit dp2= P2^5;sbit dp3= P2^4;sbit CS=P1^2;sbit SK=P1^4;sbit DI=P1^1;sbit DO=P1^5;char dpt;unsigned char dpbuf[4]={0,0,0,0};void delay(void){unsigned int x,y;for (x=0;x<200;x++)for (y=0;y<200;y++);}void shift1(uchar num,uchar sdata) {unsigned char i;for(i=0;i<num;i++){SK=0;sdata<<=1;DI=CY;SK=1;}}void shift2(uchar num,uchar sdata) {unsigned char i;sdata<<=1;for(i=0;i<num;i++){SK=0;sdata<<=1;DI=CY;SK=1;}void write_en(void){unsigned char sb_op=0x80,add=0xc0;CS=0;CS=1;shift1(3,sb_op);shift1(7,add);CS=0;CS=1;}void erase_all(void){unsigned char sb_op=0x80,add=0x80;CS=0;CS=1;shift1(3,sb_op);shift1(7,add);CS=0;CS=1;while(DO==0);}uchar read(uchar rd_add){unsigned char i,sb_op=0xc0,rd_data=0x00;CS=0;CS=1;shift1(3,sb_op);shift2(7,rd_add);for(i=0;i<8;i++){ rd_data<<=1;SK=0;SK=1;CY=DO;if(CY==1)rd_data|=0x01;else rd_data&=0xfe;}//SK=0;CS=0;CS=1;return(rd_data);void write(uchar wr_add,uchar wr_data) {unsigned char sb_op=0xa0;CS=0;CS=1;shift1(3,sb_op);shift2(7,wr_add);shift1(8,wr_data);CS=0;CS=1;while(DO==0);}void erase(uchar er_add){unsigned char sb_op=0xe0;CS=0;CS=1;shift1(3,sb_op);shift2(7,er_add);CS=0;CS=1;while(DO==0);}void wr_all(uchar wr_data){unsigned char sb_op=0x80,wr_add=0x40;CS=0;CS=1;shift1(3,sb_op);shift1(7,wr_add);shift1(8,wr_data);CS=0;CS=1;while(DO==0);}void ew_disable(void){unsigned char sb_op=0x80,add=0x00;CS=0;CS=1;shift1(3,sb_op);shift1(7,add);CS=0;delay();}void main (void) {int x,i;unsigned char j;unsigned char k;#ifndef MONITOR51SCON = 0x50; /* SCON: mode 1, 8-bit UART, enable rcvr*/TMOD |= 0x20; /* TMOD: timer 1, mode 2, 8-bit reload */TH1 = 221; /* TH1: reload value for 1200 baud @16MHz */TR1 = 1; /* TR1: timer 1 run */TI = 1; /* TI: set TI to send first char ofUART */#endifTMOD=0x01;TH0=0xee;TL0=0;TR0=1;ET0=1;EA=1;write_en();for(k=0;k<10;k++){write(k,k+11);j=read(k);dpbuf[0]=0;dpbuf[1]=k;dpbuf[2]=1;dpbuf[3]=j%10;delay();}while(1);}void tmr0(void) interrupt 1 //5ms {TH0=0xee;TL0=0;if(dpt<3) dpt++;else dpt=0; //动态显示计数器 P0 = num[dpbuf[dpt]];if(dpt==0){ dp1 = dp2 = dp3 = 1;dp0 = 0;}else if(dpt==1){ dp0 = dp2 = dp3 = 1;dp1 = 0;}else if(dpt==2){ dp0 = dp1 = dp3 = 1;dp2 = 0;}//if(dpt==3)else{ dp0 = dp1 = dp2 = 1;dp3 = 0;} }。
TPIC46L03中文手册
TPIC46L01, TPIC46L02, TPIC46L03 6通道串并联低端前置FET驱动器基本功能描述∙6通道串口/并联-在低端前场效应管驱动程序∙设备可以级联∙外部功率FETs 内55伏电感式负载钳和VGS 保护夹具∙在所有漏极终端上独立的短路负载/短路到电池故障检测∙独立的关闭状态开路故障感知∙过电池-电压锁定保护和故障报告∙TPIC46L01 和TPIC46L02 的电池电压锁定保护∙异步开漏故障标志∙设备输出可与多个外部设备线与连接∙通过串行输出终端返回故障状态∙设备内部全局电源复位∙具有滞后的高阻抗CMOS 兼容输入∙TPIC46L01 和TPIC46L03 在发生短路负载故障时禁用栅极输出∙TPIC46L02 在短路负载故障发生时将栅极输出转换为低负荷周期PWM 模式∙descriptionTPIC46L01、TPIC46L02 和TPIC46L03 是低端预驱动器,提供串行输入接口和并行输入接口, 用于控制六个外部场效应晶体管(FET) 电源开关, 如在TI TPIC 族中提供的电源阵列。
这些设备主要用于低频开关, 电感负载应用, 如螺线管和继电器。
每个通道的故障状态都以串行数据格式提供。
每个驱动器通道具有独立的断开状态负载检测和状态短路负载/电池短路检测。
提供电池过电压和欠压检测和关机。
电池和输出负载故障为控制器提供实时故障报告。
每个通道还为外部场效应管提供感应-电压-瞬态保护。
这些设备通过串行输入接口或并行输入接口提供对输出通道的控制。
允许任一接口输出的命令使各自的通道GATE输出到外部FET。
当控制设备和预驱动器之间的信号数量必须被最小化时,建议串行输入接口,而操作速度并不快。
在预驱动器必须快速响应或异步响应的应用中,推荐并行输入接口。
串行操作中, 控制设备必须将CS 从高到低转换为激活串行输入接口。
当这种情况时,SDO被使能,故障数据被锁存到串行输入接口中,并且刷新FLT标志。
93C46中文
2 写允许 PE 引脚只有 93C86 有
3 这是最初的测试参数和设计或加工后el: (020)38730976 38730977 Fax: 38730925 (1) 读操作指令 READ 在接收到一个读指令和地址 从 DI 引脚在时钟驱动下输入 之前 CSI93C46/56/57/66/86 的 DO 引脚
93C66
1
01
A8-A0
A7-A0
D7-D0 D15-D0
93C57
1
01
A7-A0
A6-A0
D7-D0 D15-D0
93C86
1
01
A10-A0
A9-A0
D7-D0 D15-D0
1
EWEN 93C46
1
00
11XXXXX
11XXXX
写允许
93C56
1
00
11XXXXXXX
11XXXXXX
93C66
10XXXXXX
10XXXXX
93C86
1
00 10XXXXXXXXX 10XXXXXXXX
1
WRAL 93C46
1
00
01XXXXX
01XXXX D7-D0 D15-D0
把数据写到全部的存储器中
93C56
1
00
01XXXXXXX 01XXXXXX D7-D0 D15-D0
93C66
1
00
01XXXXXXX 01XXXXXX D7-D0 D15-D0
是高阻态的 接收到读指令和地址后 DO 引脚先输出一个虚拟的低电平 然后数据根据时钟信号移位输 出 高位在前 数据在时钟信号 SK 的上升沿时输出并经过一定的时间后稳定 tPD0 或 tPD1
单片机读写SD卡API模式读写
单片机读写SD卡最简单最根本的程序处理器:s3c44b0 〔arm7〕SD卡与处理器的引脚连接:MISO -->SIOR*D MOSI -->SIOT*D CLK -->SCLK CS -->PE5四个文件:sd_drive.c :用户API函数,移植时不需修改sd_cmd.c:中间层函数,移植时不需修改sd_hard.c:硬件层函数,移植时需修改sd_config.h:一些功能的宏定义,移植时需修改第一次读写SD卡时,需调用SD_Init(void),然后就可以条用Read_Single_Block或者Write_Single_Block进展读写操作注意:进展写操作时,最好不要写前700个扇区,应为这些扇区都是FAT文件系统的重要扇区,一旦误写则可能会导致SD无法被电脑识别,需格式化。
/*******************************************************文件名:sd_drive.c作用:用户API函数,包括四个函数,读取一块扇区〔512字节〕U8 Read_Single_Block(U32 blk_addr, U8 *r*_buf) 写一个扇区〔512字节〕U8 Write_Single_Block(U32 blk_addr, U8 *t*_buf)获取SD卡根本信息,即读CSD存放器信息〔16字节〕:void SD_info()SD卡初始化:U8 SD_Init(void)********************************************************//********************************************功能:读取一个block输入:blk_addr为第几个block,r*_buf为数据缓存区首地址输出:返回NO_ERR则成功,其它则读取失败********************************************/U8 Read_Single_Block(U32 blk_addr, U8 *r*_buf){U16 rsp = 1;U8 i = 0;SD_sel(); //使能SD卡while(rsp && (i < 100)){write_cmd(CMD17, blk_addr << 9); //写命令CMD17rsp = Get_rsp(R1); //获取容许send_clk();}if(i > 99) //如果命令超时,则执行超时处理{SD_desel();Uart_Printf("fail in writing CMD17\n");return WR_SGL_BLK_ERR;}spi_ro_mode();send_clk(); //发送8个clkread_data(r*_buf); //读取512字节SD_desel();Uart_Printf("succeed in reading the %dst block\n", blk_addr); return NO_ERR;}/********************************************功能:写一个block输入:blk_addr为要写第几个block,t*_buf为数据区输出:返回NO_ERR则成功,其它则读取失败********************************************/U8 Write_Single_Block(U32 blk_addr, U8 *t*_buf){U16 rsp = 1;U8 i = 0;SD_sel(); //使能SD卡while(rsp && (i < 100)){write_cmd(CMD24, blk_addr << 9); //写命令CMD24rsp = Get_rsp(R1); //获取容许send_clk();}if(i > 99) //如果命令超时,则执行超时处理{SD_desel();Uart_Printf("fail in writing CMD17\n");return WR_SGL_BLK_ERR;}spi_ro_mode();send_clk(); //发送8个clkwrite_data(t*_buf); //读取512字节SD_desel();Uart_Printf("succeed in writing a block\n");return NO_ERR;}/********************************************功能:SD卡初始化输入:无输出:返回NO_ERR则成功,其它则读取失败********************************************/U8 SD_Init(void){U16 rsp = 1;U8 i = 0;spi_port_init(); //初始化spi端口spi_low_speed(); //初始化时SPI的速度必须低于400khzspi_ro_mode(); //只读模式SD_sel(); //选择SD卡for (i = 0;i < 10; i++) //发送至少75个clksend_clk();while(rsp && (i++ < 100)){write_cmd(CMD0, 0); //写命令CMD0rsp = Get_rsp(R1); //获取容许if (rsp == 1) //rsp为0则初始化成功,为1则继续写CMD0 break;send_clk();}SD_desel();if (i > 99) //初始化超时处理{Uart_Printf("fail in writing CMD0\n");return INIT_FAIL;}i=0;SD_sel();while(rsp && (i++ < 100)){write_cmd(CMD1, 0); //写CMD1rsp = Get_rsp(R1); //获取容许send_clk();}SD_desel();if (i > 99){Uart_Printf("fail in writing CMD1\n");return INIT_FAIL;}Uart_Printf("SD card init OK\n");spi_high_speed(); //初始化工作全部完毕,SPI进入模式模式spi_rt_mode();return NO_ERR;}/********************************************功能:获取SD卡信息输入:输出:********************************************/void SD_info(){U8 rsp=0;U8 csd[16];SD_sel();write_cmd(CMD9, 0);rsp = Get_rsp(R1);if (rsp != 0){SD_desel();Uart_Printf("error in getting SD info\n");return ;//GET_INFO_ERR;}if (read_register(16, csd) != NO_ERR){SD_desel();return ;}SD_desel();Uart_Printf("SD information :\n");if (csd[0] & 0*40 ==0*40){Uart_Printf("version 2.0\n");Uart_Printf("size is : %d\n",1024 * (csd[8]<<8 + csd[9]));}else{Uart_Printf("version 1.* \n");Uart_Printf("size is : %d MByte\n", ((((csd[6]&0*03)<<10) | (csd[7]<<2) | ((csd[8]&0*C0)>>6) + 1) * (1 << ((((csd[9]&0*03)<<1) | ((csd[10]&0*80)>>7)) + 2)))>>11);}Uart_Printf("ma* block lenght is : %d\n",1<<(csd[5]&0*0f));}/****************************************************************************文件名:sd_cmd.c作用:中间层函数****************************************************************************//********************************************功能:向SD写入一个命令输入:cmd为命令,addr为SD卡片地址输出:无********************************************/void write_cmd(U8 cmd, U32 addr){U8 i = 0;U8 temp[4];spi_rt_mode(); //spi发送与接收模式if (cmd <= 13) //前13个命令与地址无关{spi_write_byte((cmd & 0*3F) | 0*40); //命令最高两位必须是01for(i = 0; i < 4; i++) //发送4个0,协议规定的spi_write_byte(0);if (cmd == 0)spi_write_byte(0*95); //如果是CMD0,则要发送CRC校正else spi_write_byte(0*ff); //非CMD0,则无需CRC校正,默认为0*FF}else{for(i = 0; i < 4; i++) //将32位的地址分割成4个字节,准备发送temp[i]=(char)(addr >> (24 - 8 * i));spi_write_byte((cmd & 0*3F) | 0*40); //命令最高两位必须是01for(i =0; i < 4; i++)spi_write_byte(temp[i]); //发送地址,共4个字节spi_write_byte(0*ff); //非CMD0,则无需CRC校正,默认为0*FF}}/********************************************功能:获取SD卡的容许字节,可能是一个或者两个字节输入:type为容许类型输出:容许字节,个数有容许类型而定********************************************/U16 Get_rsp(U8 type){U16 rsp, temp;spi_ro_mode(); //spi只读模式send_clk(); //先发送8个clkrsp = spi_read_byte(); //用spi读取容许字节if (rsp & 0*8)rsp = spi_read_byte();if (type == R2) //如果是R2类型,则容许为两个字节,须再次读取{temp = rsp << 8;rsp = spi_read_byte();rsp = temp | rsp;}return rsp;}/********************************************功能:读取SD的一个block的容,一般为512字节输入:buffer为数据缓存区头地址输出:无********************************************/void read_data(U8 *buffer){U32 i;U8 rsp = 0;while(!(rsp == 0*fe)) //容许字节的最低为0则代表起始位rsp = spi_read_byte();for(i = 0;i < BLOCK_LEN; i++) //读一个block的容,一般为512字节buffer[i] = spi_read_byte();for(i = 0; i < 2; i++) //读两个CRC校正码send_clk();send_clk(); //读完毕字节}/********************************************功能:写入SD的一个block的容,一般为512字节输入:buffer为数据缓存区头地址输出:********************************************/U8 write_data(U8 *buffer){U16 rsp = 0, tmp = 0, busy = 0, i = 6;spi_rt_mode();spi_write_byte(0*fe); //起始位for(i = 0; i < 512; i++) //发送512个字节spi_write_byte(buffer[i]);for(i = 0; i < 2; i++) //发送16位的CRC校正spi_write_byte(0*ff);spi_ro_mode(); //等待容许while(!(rsp == 0*1)){rsp =(U16)spi_read_byte();tmp = rsp;rsp &= 0*11;}while(!(busy == 0*ff)) //判忙{busy = spi_read_byte();}tmp &= 0*e;if (tmp == 4)return NO_ERR;else{Uart_Printf("writing error\n");return WR_SGL_BLK_ERR;}}/********************************************功能:输入:输出:********************************************/U8 read_register(U8 len, U8 *buffer){U8 rsp = 0*ff, i = 0;spi_ro_mode();while((rsp == 0*ff) && (i < 100)){rsp=spi_read_byte();}if (i > 99){Uart_Printf("ERR in readding register\n");return rsp;}if (rsp != 0*fe){buffer[0] = rsp;i = 1;}elsei = 0;for( ; i < len; i++)buffer[i] = spi_read_byte();for(i = 0; i < 2; i++ )send_clk();send_clk();return NO_ERR;}/*******************************************************************文件名:sd_hard.c作用:硬件层函数,移植时需根据处理器或者硬件构造的不同,对该文件的函数进展修改********************************************************************//********************************************功能:使能SPI,发送CLK输入:无输出:无********************************************/void send_clk(){rSIOCON |= (1 << 3); //使能SPIwhile (!(rINTPND & BIT_SIO)); //等待发送完毕rI_ISPC|=BIT_SIO; //去除中断标志}/********************************************功能:用SPI发送一个字节输入:dat为要发送的字节输出:无********************************************/void spi_write_byte(U8 dat){rSIODAT = dat;send_clk(); //SPI发送}/********************************************功能:用SPI读取外设一个字节输入:无输出:读到的一个字节********************************************/U8 spi_read_byte(void){send_clk(); //SPI发送return rSIODAT;}/********************************************功能:初始化SPI的端口输入:无输出:无********************************************/void spi_port_init(){rIVTT = 0;rPCONF = (rPCONF & 0*e3ff) | 0*1B0C00; //除了CLK,MISO,MOSI外,不改变其他位rPUPF |= 0*160; //使能MISO的上拉电阻}/***************************************************************文件名:sd_config.h作用:相关功能的宏定义,以便被以上三个文件调用,便于移植移植时需修改***************************************************************/*ifndef _SD_CONG*define _SD_CONG*define BLOCK_LEN (512) //一个block的长度*define CMD0 0*define CMD1 1 // 读OCR存放器*define CMD9 9 // 读CSD存放器*define CMD10 10 // 读CID存放器*define CMD12 12 // 停顿读多块时的数据传输*define CMD13 13 // 读Card_Status 存放器*define CMD16 16 // 设置块的长度*define CMD17 17 // 读单块*define CMD18 18 // 读多块,直至主机发送CMD12*define CMD24 24 // 写单块*define CMD25 25 // 写多块*define CMD27 27 // 写CSD存放器*define CMD28 28 // Set the write protection bit of the addressed group*define CMD29 29 // Clear the write protection bit of the addressed group*define CMD30 30 // Ask the card for the status of the write protection bits*define CMD32 32 // 设置擦除块的起始地址*define CMD33 33 // 设置擦除块的终止地址*define CMD38 38 //擦除所选择的块*define CMD42 42 // 设置/复位密码或上锁/解锁卡*define CMD55 55 // 制止下一个命令为应用命令*define CMD56 56 // 应用命令的通用I/O*define CMD58 58 // 读OCR存放器*define CMD59 59 // 使能或制止//错误返回*define INIT_FAIL 0*define NO_ERR 1*define WR_SGL_BLK_ERR 2*define GET_INFO_ERR 3*define R1 1 //SD卡容许类型,表示一个字节*define R2 2 //SD卡容许类型,表示两个字节//一下是移植时需修改的容*define SD_desel() rPDATE=0*20; //使能SD卡*define SD_sel() rPDATE=0*00; //放开SD卡*define spi_high_speed() rSBRDR = 5; //spi高速模式*define spi_low_speed() rSBRDR = 99; //spi低速模式*define spi_ro_mode() rSIOCON = (0*0 << 7) | (0*0 << 6) | (0*0 << 5) | (0*0 << 4) | (0*0 << 3) | (0*0 << 2) | 0*1 //只读模式*define spi_rt_mode() rSIOCON = (0*0 << 7) | (0*0 << 6) | (0*1 << 5) | (0*0 << 4) | (0*0 << 3) | (0*0 << 2) | 0*1 //读写模式*endif。
基于MCU实现CPU卡读写驱动接口的设计
基于MCU实现CPU卡读写驱动接口的设计高柱荣;蔡国永【摘要】提出了一种CPU卡低层读写驱动接口的设计方案,该方案采用MCU的通用I/O引脚直接驱动CPU卡的方式实现.首先分析了CPU卡的接口特性及传输协议,介绍了方案设计时对MCU选型的注意事项和ESAM安全模块的功能及作用;接着基于Microchip公司的PIC16LF1946芯片,完成了方案中硬件接口设计和软件接口函数设计;最后对方案中给出的设计进行实现和接口验证测试.测试结果表明,该设计方案符合ISO7816标准的要求,能高效实现CPU卡的读写.【期刊名称】《微型机与应用》【年(卷),期】2016(035)008【总页数】5页(P53-57)【关键词】CPU卡;ESAM模块;读写接口;传输协议;ISO7816【作者】高柱荣;蔡国永【作者单位】桂林电子科技大学计算机科学与工程学院,广西桂林541004;桂林市利通电子科技有限责任公司,广西桂林541004;桂林电子科技大学计算机科学与工程学院,广西桂林541004【正文语种】中文【中图分类】TP368.1当今,各类IC卡(如居民身份证、社保卡、水电气充值卡等)已成为人们日常生活中不可缺少的一部分,并为人们的生活带来了极大的便利。
IC卡技术也已从最初的存储卡、逻辑加密卡发展到今天的CPU卡。
与之相应的是需要配备大量的IC卡智能终端设备。
目前开发的IC卡智能终端设备中的读写接口部分大多采用专用的接口芯片来实现,如TDA8007等,这使得产品的成本较高,体积也较大。
本文提出一种基于设备产品的主控MCU通用引脚,直接模拟通信协议实现接触式CPU 卡读写接口的低成本实用方案。
CPU卡也称智能卡(Smart Card),卡中的集成电路包括微处理器、EEPROM、随机存储器RAM、程序存储器ROM(Flash)以及片内操作系统(COS)。
装有COS的CPU卡相当于一台微型计算机,不仅具有数据存储功能,同时具有命令处理和数据安全保护等功能。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
mov a, 04bh
mov data2, a
mov a, 0c3h
mov data3, a
call ht93lc46_wral
;ht9ORG 腳接 VCC,64x16
mov temp,a
read_2:
clr data2
clr data3
mov a, temp
:near
extern ht93lc46_read
:near
extern ht93lc46_ewen
:near
extern ht93lc46_ewds
:near
extern ht93lc46_eral
:near
extern ht93lc46_wral
:near
extern ht93lc46_erase
xor a, data3
snz z
jmp fail
dec temp
snz temp.7
jmp read
;---------------------------------------------------------------
call ht93lc46_ewen
;ht93lc46 寫入致能
nop
read_3: clr data3 clr data2 mov a, temp mov dataaddr, a call ht93lc46_read
;ht93lc46 清除指定位址 ;ORG 腳接 VCC,64x16 ;ht93lc46 讀出
mov a, 0ffh xor a, data2 snz z jmp fail mov a, 0ffh xor a, data3 snz z jmp fail dec temp snz temp.7 jmp read_3
mov dataaddr, a
call ht93lc46_read
;ht93lc46 讀出
mov a, 04bh
;比較資料
xor a, data2
snz z
jmp fail
mov a, 0c3h
xor a, data3
snz z
jmp fail
dec temp
snz temp.7
jmp read_2
專案中。
在 這 個 例 子 中 , 首 先 使 用 HT93LC46_EWEN 函 數 使 HT93LC46 寫 入 致 能 ; 然 後 使 用
HT93LC46_WRITE 函數向記憶體寫入相應的位址;最後使用 HT93LC46_READ 指令將剛才
寫入的資料讀出並檢查寫入的資料是否正確。
程式如下:
;---------------------------------------------------------------
;可根據你的電路修改各引腳 CS/SK/DI/DO 的定義
;---------------------------------------------------------------
porta equ
[70h]
sk
equ
porta.1
di
equ
porta.2
do
equ
porta.3
cs
equ
porta.0
;pa
equ
[12h]
doin
equ
pa.3
;---------------------------------------------------------------
;以下部分不可修改
call ht93lc46_read
;ht93lc46 讀出
mov a, 0ffh
;比較資料
xor a, data2
snz z
jmp fail
mov a, 0ffh
xor a, data3
snz z
jmp fail
dec temp
snz temp.7
jmp read_1
;---------------------------------------------------------------
HT49 MCU 控制 HT93LC46 的讀寫
HT49 MCU 控制 HT93LC46 的讀寫
文件編碼:HA0044T
簡介
HT93LC46 EEPROM 是 Holtek 製造的 1K 位元系列的 EEPROM(電子可擦除式唯讀記憶體), 一般它用於微控制器的固定資料的儲存。在本文中,我們將以 Holtek 公司八位元微控制器 HT49 系列爲例,介紹該晶片常用的操作功能代碼。用戶只需把代碼加到程式中,並且在使 用 HT93LC46 之前將引腳 CS/SK/DI/DO 連接即可。
;
public ht93lc46_erase
;
public delay
;---------------------------------------------------------------
;資料段
ht93lc46data .section ′data′
dataaddr db ?
;操作元位址
;ORG 腳接 VCC,64x16
mov temp,a
read:
clr data2
clr data3
mov a, temp
mov dataaddr, a
call ht93lc46_read
;ht93lc46 讀出
mov a, temp
;比較資料
xor a, data2
snz z
jmp fail
cpla temp
;操作碼 oc_read equ oc_erase equ oc_write equ
10000000b 11000000b 01000000b
5
HT49 MCU 控制 HT93LC46 的讀寫
oc_ewen equ oc_ewds equ oc_eral equ oc_wral equ
00110000b 00000000b 00100000b 00010000b
:near
endif
;---------------------------------------------------------------
;宣告提供給外部程式使用的變數
public dataaddr
;資料的頁內位址
public data3
;存取的資料的高八位元
public data2
;存取的資料的低八位元
;---------------------------------------------------------------
mov a,3fh
;ORG 腳接 VCC,64x16
mov temp,a
4
HT49 MCU 控制 HT93LC46 的讀寫
write_1: mov a, temp mov dataaddr, a call ht93lc46_erase dec temp snz temp.7 jmp write_1 nop mov a,3fh mov temp,a
;---------------------------------------------------------------
ifndef ht93lc46_asm
extern dataaddr :byte
extern data3
:byte
extern data2
:byte
extern ht93lc46_write
;--------------------------------------------------------------; 檔案名:op16_93lc46s.asm ; 日期:2003/11/26 ; MCU: HT49R30A-1 ; EEPROM: HT93LC46, 64x16 bits ;--------------------------------------------------------------include ht49r30a-1.inc include ht93lc46s.asm
data .section ′data′ temp db ?
2
HT49 MCU 控制 HT93LC46 的讀寫
main .section at 0 ′code′
start:
clr pa
clr porta
set porta.3
mov a,porta
mov pa,a
;---------------------------------------------------------------
;ht93lc46 寫入
dec temp
snz temp.7
jmp write
call ht93lc46_ewds
;ht93lc46 寫入禁能
;---------------------------------------------------------------
; 開始讀數據並比較
mov a,3fh
;宣告提供給外部程式使用的副程式
public ht93lc46_eral
;
public ht93lc46_wral
;
public ht93lc46_ewen
;
public ht93lc46_ewds
;
6
HT49 MCU 控制 HT93LC46 的讀寫
public ht93lc46_write
;
public ht93lc46_read
;比較資料
jmp $
;操作成功
fail:
jmp $
;操作失敗
;---------------------------------------------------------------