智能卡(Smart Card)是一种内嵌有微芯片的塑料卡,通常与信用卡大小相同。这种卡配备了 CPU、RAM 和 I/O,能够自行处理数量较多的数据而不会干扰到主机 CPU 的工作。此外,智能卡还可以过滤错误的数据,以减轻主机 CPU 的负担。它适应于端口数目较多且通信速度需求较快的场合。 智能卡的标准主要包括 ISO7816 系列。这些标准详细规定了智能卡的物理特性、触点尺寸和位置、电信号和传输协议等关键方面。例如,ISO7816-1 规定了带触点集成电路卡的物理特性,如触点的电阻、机械强度、热耗、电磁场、静电等;ISO7816-2 则规定了 ID-1 型 IC 卡上每个触点的尺寸、位置和任务分配。 类别 除了 PSAM(销售点安全模块)和 ESAM(嵌入式安全模块)之外,智能卡还包括其他多种类型。根据应用领域和功能,智能卡主要可以划分为以下几种: 金融卡:也称为银行卡,包括信用卡和现金卡两种。信用卡可以在消费支付时按预先设定额度透支资金,而现金卡则作为电子钱包或电子存折,但不能透支。 非金融卡:也称为非银行卡,涉及范围十分广泛,实际包含金融卡之外的所有领域,诸如电信、旅游、教育和公交等等。 交通卡:这种卡主要应用于公共交通领域,如地铁、公交等。 政府应用卡:如社保卡等,现在应用较广泛。 另外,根据镶嵌芯片的不同,智能卡还可以分为存储器卡、逻辑加密卡和 CPU 卡。存储器卡功能简单,没有(或很少有)安全保护逻辑,但价格低廉,开发使用简便,存储容量增长迅猛,因此多用于某些内部信息无需保密或不允许加密的场合。逻辑加密卡有一定的安全保证,多用于有一定安全要求的场合。而 CPU 卡则具有很高的数据处理和计算能力以及较大的存储容量,同时采取了多层次的安全措施,因此应用的灵活性、适应性较强,已成为一卡多用及对数据安全保密性特别敏感场合的最佳选择。 形态 标准卡、SIM卡、双列直插(ESAM)等 通信接口 ISO7816-3 标准的智能卡接口是需要外部提供时钟(也有内部时钟的)和采用单线半双工串行通信的接口。 加密算法 通常广泛支持 3DES 算法,也有内嵌国密 SM1 算法的(如电力上用的 ESAM 芯片、CPU 卡等)。 功能 信息存储(内置EEPROM)、秘钥管理、权限认证等。 驱动电路 可以直接使用带有智能卡模式的 USART 通信,USART_CK 接 CLK,USART_TX(智能卡模式收发在内部通过SW_RX连接)接 IO。 如果要适应更多卡,比如不同的电压,或为电路提供更多的安全保障(短路等),通常会选择专用的接口芯片装在卡与 MCU 之间,比如使用 ST8024,更具体的可以研究一下 8024 的手册看...
白光 T12 烙铁头
T12 烙铁头也叫 T12 发热芯、T12 焊咀,是日本白光公司(Hakko)推出的 FX-951 拆消静电电焊台标配的烙铁头型号名称。T12 烙铁头属复合型焊咀,是发热芯、温度传感器、烙铁头三个部件的复合体。 T12 烙铁头的特点是:传感器充分前置,对温度变化敏感度高;发热芯部件安装在小体积的烙铁头内部,热量损失极小。 热电偶是一种感温元件。它直接测量温度,并把温度信号转换成热电动势信号, 通过电气仪表转换成被测介质的温度。热电偶测温的基本原理是两种不同成份的材质导体组成闭合回路,当两端存在温度梯度时,回路中就会有电流通过,此时两端之间就存在电动势——热电动势,这就是所谓的塞贝克效应(Seebeck effect)。两种不同成份的均质导体为热电极,温度较高的一端为工作端,温度较低的一端为自由端。 T12 内部可视为发热丝串联了热电偶,通电时加热,断电时测温。所以一般 T12 都是使用 PWM 控制,高电平驱动 MOS 加热,低电平时 MOS 断开运放放大热电偶电动势测得温度,后反馈调节 PWM 占空比实现恒温。运放放大的是热端的电动势,对应的温度是烙铁头的温度 + 室温,所以要减去室温才是真正烙铁头的温度,这一过程就是所谓的冷端补偿。T12 用的是 K 型热电偶。(据说接近 N 型,后续验证一下看看。) K 型热电偶是目前用量最大的廉金属热电偶,其用量为其他热电偶的总和。K 型热电偶丝直径一般为 1.2mm~4.0mm。正极(KP)的名义化学成分为:Ni : Cr = 90 : 10(镍铬合金),负极(KN)的名义化学成分为:Ni : Si = 97 : 3(镍硅合金),其使用温度为 -200℃ ~ 1300℃。K 型热电偶具有线性度好,热电动势较大,灵敏度高,稳定性和均匀性较好,抗氧化性能强,价格便宜等优点,能用于氧化性惰性气氛中广泛为用户所采用。K 型热电偶不能直接在高温下用于硫,还原性或还原,氧化交替的气氛中和真空中,也不推荐用于弱氧化气氛。 圈子里的名词: 白菜白光:用廉价的控制电路 + 二手白光焊嘴 DIY 的烙铁,更高档的还有牛肉白光、鲍鱼白...
Cortex-M3 HardFault_Handler 调试心得
这几天在 MDK 下调试 STM32 在进入 HardFault_Handler 异常中端原因的问题上花费了不少周折 简单来说应该采取下面的查找思路: 1、进入 HardFault_Handler 后根据 LR 确定异常发生处所使用的栈指针是 MSP 还是 PSP 2、查看 PSP(假设是 PSP)的值,在 RAM 中找到 PSP 所指的区域 3、地址按从低到高的顺序分别存放了 R0,R1,R2,R3,R12,LR,PC,XPSR 的顺序找出 PC 的值 4、根据 PC 的值找到异常程序的位置 5、分析异常程序位置的 FLASH 及 RAM 访问相关方面是否有异常值,一般是 RAM 被异常修改导致从此处取到了错误的访问地址引起的。 在 HardFault_Handler 打断点,在 Call Stack + Locals 窗口查看调用顺序,在某个入口点右键执行 Show Caller Code 跳到响应程序的位置再仔细查看出错原因...
STM32F1 库函数的宏定义
1、USE_STDPERIPH_DRIVER 宏定义 要在编译器中预定义这个宏: 而且在编译器中仅仅定义这一个宏就可以了。STM32F10X_HD 这类的宏在编译器中选好 MCU 型号后就自动确定下来对应的宏了。 2、HSE_VALUE 宏定义 HSE_VALUE 需要根据实际使用的晶体频率修改,RCC_GetClocksFreq 中会用它来算出系统时钟。因为 USART_Init、I2S_Init、I2C_Init 用到了 RCC_GetClocksFreq,所以如果不修改 HSE_VALUE 为实际情况下的值会出现串口波特率错误等问题。不要直接修改 stm32f10x.h 中的定义,而要在 stm32f10x_conf.h 中重新定义 HSE_VALUE: #undef HSE_VALUE #define HSE_VALUE ((uint32_t)xxx...
STM32 CAN 总线通信
CAN 是控制器局域网络 (Controller Area Network, CAN) 的简称,是由以研发和生产汽车电子产品著称的德国 BOSCH(没错,就是那个卖电动工具的博世)公司开发的,并最终成为国际标准(ISO 11898),是国际上应用最广泛的现场总线之一。 在北美和西欧,CAN 总线协议已经成为汽车计算机控制系统和嵌入式工业控制局域网的标准总线,并且拥有以 CAN 为底层协议专为大型货车和重工机械车辆设计的 J1939 协议。 CAN 采用多主工作方式,节点之间不分主从,但节点之间有优先级之分,通信方式灵活,可实现点对点、一点对多点及广播方式传输数据,无需调度。CAN 采用的是非破坏性总线仲裁技术,按优先级发送,可以大大节省总线冲突仲裁时间,在重负荷下表现出良好的性能。CAN 采用短帧结构传输,每帧有效字节为 8 个,传输时间短,受干扰的概率低。而且每帧信息都有 CRC 校验和其它检错措施,保证数据出错率极低。当节点严重错误时,具有自动关闭功能,使总线上其它节点不受影响,所以 CAN 是所有总线中最为可靠的。CAN 总线可采用双绞线、同轴电缆或光纤作为传输介质。它的直接通信距离最远可达 10km,通信速率最高达 1M bps(通信距离为 40m 时),总线上可挂设备数主要取决于总线驱动电路,最多可达 110 个。但 CAN 不能用于防爆区。 CAN网拓扑结构 CAN 是半双工的。收发数据要分时进行。不管 CAN 网络上挂多少设备,在同一时刻只能有 1 个发送数据。如果有多个需要同时发送则只有优先级别高的先发送,其它等待。控制器有收发两个接口,但是收发器的两个接口变成了 High 和 Low。CAN 总线式两线制的。在这点上可以与 Uart 控制器与 RS-485 收发器来类比。 CAN 协议目前有 2.0A 和 2.0B。CAN 2.0A 是 CAN 协议的 PART A 部分,此部分定义了 11bit 的标识区 。 CAN 2.0B 是 CAN 协议的扩展部分,也叫 PART B,定义了 29bit 的标识区,设计上与 CAN2.0A 兼容。通常支持 2.0B 协议的芯片同时也支持 2.0A。 STM32 单片机的 CAN 控制器接口有收、发两个口,互联型有两个 CAN 控制器。两个 CAN 都分别拥有自己的发送邮箱和接收 FIFO,但是他们共用 28 个滤波器。通过 CAN_FMR 寄存器的设置,可以设置滤波器的分配方式。 STM32 的过滤器组最多有 28 个(互联型),但是 STM32F103ZET6 只有 14个(增强型),每个过滤器组由 2 个 32 为寄存器,CAN_FxR1 和 CAN_FxR2 组成。过滤器有两种工作模式:屏蔽位模式和标识符列表模式。工作在屏蔽位模式时 CAN_FxR2 为 1 的位指示了接收到的标识位必须与 CAN_FxR1 相对应的位的 0 或 1 完全一致才能通过过滤器。如果 CAN_FxR2 全为 0 也就意味着不进行任何过滤。工作在标识符列表模式时 CAN_FxR1 和 CAN_FxR2 互不相干,CAN_FxR2 也是一个像 CAN_FxR1 的寄存器,当接收到的标识符与 CAN_FxR1 或 CAN_FxR2 完全匹配时才能通过过滤器。 STM32 提供了两种测试模式,环回模式和静默模式。环回测试模式不需要短接外部的两个脚,它是在内部环回的...
STM32 定时器
预分频器(TIMx_PSC) 预分频器的值 PSC[15:0],计数器的时钟频率 CK_CNT 等于 fCK_PSC / (PSC[15:0] + 1)。也就是说 PSC[15:0] 等于分频数 - 1。 自动重装载寄存器(TIMx_ARR) 自动重装载的值 ARR[15:0],用于作为计数器的初始值(向下计数)或溢出值(向上计数)。下图的 ARR 被设置为 0x36,溢出发生在计数值为 0x36 的后部,所以实际计数了 0x37 个数(从 0 开始)。所以 ARR 的值应该为 计数值 - 1。 PWM PWM 模式 1 在向上计数时,一旦 TIMx_CNT < TIMx_CCR1 时通道 1 为有效电平,否则为 无效电平;在向下计数时,一旦 TIMx_CNT > TIMx_CCR1 时通道 1 为无效电平(OC1REF=0),否 则为有效电平(OC1REF=1)。 PWM 模式 2 在向上计数时,一旦 TIMx_CNT < TIMx_CCR1 时通道 1 为无效电平,否则为 有效电平;在向下计数时,一旦 TIMx_CNT > TIMx_CCR1 时通道 1 为有效电平,否则为无效电 平。 CC1P:输入/捕获 1 输出极性(Capture/Compare 1 output polarity) CC1 通道配置为输出: 0:OC1 高电平有效 TIM_OCPolarity_High 1:OC1 低电平有效 TIM_OCPolarity_Low 例如: TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //PMW模式1(向上计数时CNT < CCR2时输出低电平) TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = TIM_TimeBaseStructure.TIM_Period / 2; //50%占空比 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //低电平为有效电平 TIM_OC2Init(TIM2, &TIM_OCInitStructure)...
铁电(FRAM)随机存取存储器 MB85RC64
存储空间:8KB 不同于 Flash 和 E2PROM,无需写等待时间。 使用 I2C 总线,频率可到 400KHz。 数据可以保持 10 年。 WP 脚为高电平时处于写保护状态,默认已内部下拉到地。 器件地址为 7bits 模式,高4位为设备类型码(1010b),低 3 位由硬件引脚 A2、A1、A0 指定(已内部下拉),与 MB85RC16 是不同的。这使得一条总线上可以挂载多个同型号的器件。 存储器的写与读速度是相同的,所以无需在写的时候额外添加等待时间。 8KB 存储空间的有效地址为 13 位。 随机读: 写字节: 写页: 存储器的页指的是整个 8KB 的存储区,没有划分为若干页。当地址空间溢出时回回滚到 000H 继续增长...
I2C 通信协议
I2C(Inter-Integrated Circuit,又常写作 IIC、$I^2C$)是一种广泛应用于数字电路中的串行通信协议。这种通信协议由 Philips 公司(现在的 NXP 公司)在 20 世纪 80 年代开发,旨在解决多个芯片间的通信问题。I2C 通信协议具有简单、高可靠性和灵活性的特点,因此被广泛应用于各种不同领域的电子设备中。 I2C 协议使用两根线进行数据传输,分别是 SDA(Serial Data Line)和 SCL(Serial Clock Line)。数据在 SDA 线上传输,而时钟同步则由 SCL 线提供。这两根线在通信过程中通过电平变化来传输数据,并且都有上拉电阻。 在 I2C 通信中,有两个主要的参与者角色:主设备(Master)和从设备(Slave)。主设备是 I2C 总线的控制者,负责发起通信和发送指令;从设备则根据主设备的指令执行相应的操作并返回数据。 I2C 通信协议的基本操作包括起始条件和停止条件。起始条件是主设备发起通信的标志,它的产生是通过在 SCL 线保持高电平的同时将 SDA 线从高电平拉低。停止条件是通信结束的标志,在 SCL 线保持高电平的同时将 SDA 线从低电平拉高。 在起始条件之后,主设备会发送一些控制字节来选择特定的从设备进行通信。这些控制字节通常包括从设备的地址和读/写控制位。一旦从设备被选择,数据传输可以开始。数据的传输采用字节为单位,每个字节的传输分为数据传输和应答两个部分。 此外,I2C 协议还规定了数据有效性、地址及数据方向、应答信号和非应答信号等方面的细节,以确保通信的准确和可靠。 读写标志位:1 为读,0 为写。 注意: SDA 使用 GPIO 的 OD 模式时,在读前不需要将 GPIO 切换为输入模式,可以直接读取,但需要在读前将其输出电平置为高,这时由于时开漏状态,是由外部上拉电阻将总线拉高的,这时从设备才可以将总线拉低。如果主设备输出低电平则总线一直被主设备强拉低而使从设备不能正常输出高电平,从而使读通信不能正常进行。 主机在收完从机的 ACK 后要把 SCL 拉低,否则从机一直保持输出电平(SCL 高电平是从设备电平不能变化),比如 ACK 时一直输出低电平,NACK 时一直输出高电平,主机的 Sr 开始信号不能够使从机重新开始。 SDA 线上的数据在时钟“高”期间必须是稳定的,只有当 SCL 线上的时钟信号为低时,数据线上的“高”或“低”状态才可以改变。 数据有效性 I2C 使用 SDA 信号线来传输数据,使用 SCL 信号线进行数据同步。SDA 数据线在 SCL 的每个时钟周期传输一位数据。传输时,SCL 为高电平的时候 SDA 表示的数据有效,即此时的 SDA 为高电平时表示数据“1”,为低电平时表示数据“0”。当 SCL 为低电平时,SDA 的数据无效,一般在这个时候 SDA 进行电平切换,为下一次表示数据做好准备。 重启动信号 在主控器控制总线期间完成了一次数据通信(发送或接收)之后,如果想继续占用总线再进行一次数据通信(发送或接收),而又不释放总线,就需要利用重启动 Sr 信号时序。重启动信号 Sr 既作为前一次数据传输的结束,又作为后一次数据传输的开始。利用重启动信号的优点是,在前后两次通信之间主控器不需要释放总线,这样就不会丢失总线的控制权,即不让其他主器件节点抢占总线。 Sr 的型号与 S 是完全一样的,后面要重新发送器件地址,与S后的逻辑完全一致。 I2C 有 7 位和 10 位两种地址模式 I2C 规范保留了两组和 8 个地址,1111XXX 和 0000XXX。这些地址用于特殊用途。 从机地址+R/W 描述 0000 0000 呼叫地址 0000 0001 起始字节 0000 001X CBUS地址 0000 010X 保留供不同的总线格式 0000 011X 保留将来用 0000 1XXX HS模式主机码 1111 0XXX 10位从机地址 1111 1XXX 保留将来用 I2C 总线的 10bit 寻址和 7bit 寻址是兼容的,这样就可以在同一个总线上同时使用 7bit 地址和 10bit 地址模式的设备,在进行 10bit 地址传输时,第一字节是一个特殊的保留地址来指示当前传输的是 10bit 地址...
铁电(FRAM)随机存取存储器 MB85RC16
存储空间:2KB 不同于 Flash 和 E2PROM,无需写等待时间。 使用 I2C 总线,频率可到 1MHz。 数据可以保持 10 年。 WP 脚为高电平时处于写保护状态,默认已内部下拉到地。 器件地址为 7bits 模式,高 4 位为设备类型码(1010b),低 3 位为存储地址的高 3 位。 写字节: 写页: 存储器的页指的是整个 2KB 的存储区,没有划分为若干页。当地址空间溢出时回回滚到 000H 继续增长。 读当前地址: 上一次操作完成后存储器的地址仍被保留再地址缓冲器中,这时使用读当前地址命令可以直接读到缓冲器缓存的地址(n + 1)指向的存储区。地址缓冲器中的地址在上电后是不确定的。11 位地址的高三位是需要指定的。 随机读取: 读取可以持续进行,地址溢出后会回滚到000...
AT24CXX EEPROM 存储器芯片
AT24CXX 是 ATMEL 公司的两线制(I2C 或 IIC)汽车温度级串行 EEPROM 存储器,AT24C01A、AT24C02、AT24C04、AT24C08A、AT24C16A 等多款型号,他们的存储空间分别为 128 字节、256 字节、512 字节、1024 字节、2048 字节。 I2C 时钟支持 400KHz。 I2C 器件基础地址(ID)为:0x50,可以通过部分引脚配置扩展地址,从而可以实现在一条总线上挂载多片同类型芯片的目的。 读操作支持随机寻址并连续读多字节数据(地址自动增加,当到达边界时会回滚至 0 地址重新增长)。 写操作支持单字节写入和页写入。1K/2Kbits 芯片页空间为 8 字节,4K/8K/16Kbits 芯片页空间为 16 字节。当连续写入时地址会自动增加,但地址会在页内回滚循环。收到 I2C 停止信号时开始写入,写入周期为 5m...