• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

STM32的学习总结~~

先占个位置,后续边学习边更新~~

把自己所学的,所理解的东西发出来~~

全部回复(29)
正序查看
倒序查看
斌520
LV.9
2
2013-07-19 21:53

总结的东西在哪呀,我也是来学习的!

0
回复
dulai1985
LV.10
3
2013-07-20 14:56
@斌520
总结的东西在哪呀,我也是来学习的!
(2)一个在core_m3.h中 
/* SysTick Control / Status Register Definitions */ 定义COUNTFLAG在SysTick_CTRL寄存器中的位置 
#define SysTick_CTRL_COUNTFLAG_Pos         16   
#define SysTick_CTRL_COUNTFLAG_Msk    (1ul << SysTick_CTRL_COUNTFLAG_Pos) 定义CLKSOURCE在SysTick_CTRL寄存器中的位置 #define SysTick_CTRL_CLKSOURCE_Pos          2 
#define SysTick_CTRL_CLKSOURCE_Msk    (1ul << SysTick_CTRL_CLKSOURCE_Pos)
定义TICKINT在SysTick_CTRL寄存器中的位置  SysTick 倒数到 0 时会导致挂 
起Systick处理器 
#define SysTick_CTRL_TICKINT_Pos              1 
#define SysTick_CTRL_TICKINT_Msk        (1ul << SysTick_CTRL_TICKINT_Pos) 定义ENABLE在SysTick_CTRL寄存器中的位置 使能Systick定时器 #define SysTick_CTRL_ENABLE_Pos              0 
#define SysTick_CTRL_ENABLE_Msk        (1ul << SysTick_CTRL_ENABLE_Pos) /* SysTick Reload Register Definitions  SysTick_LOAD =0xFFFFFF */ #define 
0
回复
dulai1985
LV.10
4
2013-07-20 15:24
@dulai1985
(2)一个在core_m3.h中 /*SysTickControl/StatusRegisterDefinitions*/定义COUNTFLAG在SysTick_CTRL寄存器中的位置 #defineSysTick_CTRL_COUNTFLAG_Pos    16  #defineSysTick_CTRL_COUNTFLAG_Msk  (1ul

在第3楼这段程序中

你可以看到

#define SysTick_CTRL_COUNTFLAG_Pos         16   
#define SysTick_CTRL_COUNTFLAG_Msk    
(1ul << SysTick_CTRL_COUNTFLAG_Pos) 

很多人都会有疑问,这个1UL是什么意思?

下面就是解释

0UL 表示 无符号长整型 0

1UL 表示 无符号长整型 1

如果不写UL后缀,系统默认为:int, 即,有符号整数。



0
回复
dulai1985
LV.10
5
2013-07-20 15:25
@dulai1985
在第3楼这段程序中你可以看到#defineSysTick_CTRL_COUNTFLAG_Pos    16  #defineSysTick_CTRL_COUNTFLAG_Msk  (1ul
#define ABC (1ul << 16) 
就是指 下面程序中  用ABC  代替  所有的   (1ul<<16)这个东西

而(1ul<<16)  这个操作要做什么呢。  1ul可以是一个int 型的变量,让它 左移位 16 

1ul<<16的结果是一个unsigned long int 数,这个数的大小是 
1<<16


0
回复
dulai1985
LV.10
6
2013-07-20 15:25
@dulai1985
#define ABC (1ul 
1ul是1,类型为unsigned long,1左移63位,就可取unsigned long的最高位了
0
回复
dulai1985
LV.10
7
2013-07-20 16:16
@dulai1985
1ul是1,类型为unsignedlong,1左移63位,就可取unsignedlong的最高位了

uCOS里面的时间管理关键宏定义OS_TICKS_PER_SEC

OS_TICKS_PER_SEC这个东西表示CPU一秒钟进行多少次时钟中断,也就决定了最小的延时间隔,比如OS_TICKS_PER_SEC设置成100,则表示1s里面会发生100次时钟中断,也就是10ms来一次中断,则最小的延时单位就是10ms。

在LM3S平台下移植ucos,用systick来做时间管理的时钟源的话,初始化的时候是这样写的:

SysTickPeriodSet((INT32U)(SysCtlClockGet() / OS_TICKS_PER_SEC) );

0
回复
dulai1985
LV.10
8
2013-07-22 17:19
@dulai1985
uCOS里面的时间管理关键宏定义OS_TICKS_PER_SECOS_TICKS_PER_SEC这个东西表示CPU一秒钟进行多少次时钟中断,也就决定了最小的延时间隔,比如OS_TICKS_PER_SEC设置成100,则表示1s里面会发生100次时钟中断,也就是10ms来一次中断,则最小的延时单位就是10ms。在LM3S平台下移植ucos,用systick来做时间管理的时钟源的话,初始化的时候是这样写的:SysTickPeriodSet((INT32U)(SysCtlClockGet()/OS_TICKS_PER_SEC));
STM32 BIT_BAND 位带别名区使用入门 
  支持了位带操作(bit_band),有两个区中实现了位带。其中一个是SRAM 区的最低1MB 范围,第二个则是片内外设  //  区的最低1MB 范围。这两个区中的地址除了可以像普通的RAM 一样使用外,它们还都有自  
//  己的“位带别名区”,位带别名区把每个比特膨胀成一个32 位的字  //  
//  每个比特膨胀成一个32 位的字,就是把  1M  扩展为 32M ,  //  
//  于是;RAM地址 0X200000000(一个字节)扩展到8个32 位的字,它们是:  //   0X220000000 ,0X220000004,0X220000008,
0X22000000C,0X220000010,0X220000014, 0X220000018,0X22000001C  // 支持位带操作的两个内存区的范围是:  // 0x2000_0000‐0x200F_FFFF(SRAM 区中的  
// 0x4000_0000‐0x400F_FFFF(片上外设区中的最低1MB)  /*    
对SRAM 位带区的某个比特,记它所在字节地址为A,位序号  在别名区的地址为:  
AliasAddr= 0x22000000 +((A‐0x20000000)*8+n)*4 =0x22000000+ (A‐0x20000000)*32 + n*4  
对于片上外设位带区的某个比特,记它所在字节的地址为A,位序号为n(0<=n<=7),则该比特  在别名区的地址为:  
AliasAddr= 0x42000000+((A‐0x40000000)*8+n)*4 =0x42000000+ (A‐0x40000000)*32 + n*4  
上式中,“*4”表示一个字为4 个字节,“*8”表示一个字节中有8 个比特。     */  
// 把“位带地址+位序号”转换别名地址宏  
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))  //把该地址转换成一个指针  
#define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr))  // MEM_ADDR(BITBAND( (u32)&CRCValue,1)) = 0x1;     
例如点亮LED    
// 使用STM32库   
   GPIO_ResetBits(GPIOC, GPIO_Pin_4); //关LED5     GPIO_SetBits(GPIOC, GPIO_Pin_7);   //开LED2
STM32 BIT_BAND 位带别名区使用入门 
  支持了位带操作(bit_band),有两个区中实现了位带。其中一个是SRAM 区的最低1MB 范围,第二个则是片内外设  //  区的最低1MB 范围。这两个区中的地址除了可以像普通的RAM 一样使用外,它们还都有自  
//  己的“位带别名区”,位带别名区把每个比特膨胀成一个32 位的字  //  
//  每个比特膨胀成一个32 位的字,就是把  1M  扩展为 32M ,  //  
//  于是;RAM地址 0X200000000(一个字节)扩展到8个32 位的字,它们是:  //   0X220000000 ,0X220000004,0X220000008,
0X22000000C,0X220000010,0X220000014, 0X220000018,0X22000001C  // 支持位带操作的两个内存区的范围是:  // 0x2000_0000‐0x200F_FFFF(SRAM 区中的  
// 0x4000_0000‐0x400F_FFFF(片上外设区中的最低1MB)  /*    
对SRAM 位带区的某个比特,记它所在字节地址为A,位序号  在别名区的地址为:  
AliasAddr= 0x22000000 +((A‐0x20000000)*8+n)*4 =0x22000000+ (A‐0x20000000)*32 + n*4  
对于片上外设位带区的某个比特,记它所在字节的地址为A,位序号为n(0<=n<=7),则该比特  在别名区的地址为:  
AliasAddr= 0x42000000+((A‐0x40000000)*8+n)*4 =0x42000000+ (A‐0x40000000)*32 + n*4  
上式中,“*4”表示一个字为4 个字节,“*8”表示一个字节中有8 个比特。     */  
// 把“位带地址+位序号”转换别名地址宏  
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))  //把该地址转换成一个指针  
#define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr))  // MEM_ADDR(BITBAND( (u32)&CRCValue,1)) = 0x1;     
例如点亮LED    
// 使用STM32库   
   GPIO_ResetBits(GPIOC, GPIO_Pin_4); //关LED5     GPIO_SetBits(GPIOC, GPIO_Pin_7);   //开LED2
0
回复
dulai1985
LV.10
9
2013-07-25 12:06
@dulai1985
STM32BIT_BAND位带别名区使用入门  支持了位带操作(bit_band),有两个区中实现了位带。其中一个是SRAM区的最低1MB范围,第二个则是片内外设 // 区的最低1MB范围。这两个区中的地址除了可以像普通的RAM一样使用外,它们还都有自 // 己的“位带别名区”,位带别名区把每个比特膨胀成一个32位的字 // // 每个比特膨胀成一个32位的字,就是把 1M 扩展为32M, // // 于是;RAM地址0X200000000(一个字节)扩展到8个32位的字,它们是: // 0X220000000,0X220000004,0X220000008,0X22000000C,0X220000010,0X220000014,0X220000018,0X22000001C //支持位带操作的两个内存区的范围是: //0x2000_0000‐0x200F_FFFF(SRAM区中的 //0x4000_0000‐0x400F_FFFF(片上外设区中的最低1MB) /*  对SRAM位带区的某个比特,记它所在字节地址为A,位序号 在别名区的地址为: AliasAddr=0x22000000+((A‐0x20000000)*8+n)*4=0x22000000+(A‐0x20000000)*32+n*4 对于片上外设位带区的某个比特,记它所在字节的地址为A,位序号为n(0
AHB  随着深亚微米工艺技术日益成熟,集成电路芯片的规模越来越大。数字IC从基于时序驱动的设计方法,发展到基于IP复用的设计方法,并在SOC设计中得到了广泛应用。在基于IP复用的SoC(System on Chip的缩写,称为系统级芯片,也有称片上系统)设计中,片上总线设计是最关键的问题。为此,业界出现了很多片上总线标准。其中,由ARM公司推出的AMBA片上总线受到了广大IP开发商和SoC系统集成者的青睐,已成为一种流行的工业标准片上结构。AMBA规范主要包括了AHB(Advanced High performance Bus)系统总线和APB(Advanced Peripheral Bus)外围总线。 
  AMBA片上总线
  AMBA 2.0规范包括四个部分:AHB、ASB、APB和Test Methodology。AHB的相互连接采用了传统的带有主模块和从模块的共享总线,接口与互连功能分离,这对芯片上模块之间的互连具有重要意义。AMBA已不仅是一种总线,更是一种带有接口模块的互连体系。
  基于AMBA的片上系统
  大多数挂在总线上的模块(包括处理器)只是单一属性的功能模块:主模块或者从模块。主模块是向从模块发出读写操作的模块,如CPU,DSP等;从模块是接受命令并做出反应的模块,如片上的RAM,AHB/APB 桥等。另外,还有一些模块同时具有两种属性,例如直接存储器存取(DMA)在被编程时是从模块,但在系统读传输数据时必须是主模块。如果总线上存在多个主模块,就需要仲裁器来决定如何控制各种主模块对总线的访问。虽然仲裁规范是AMBA总线规范中的一部分,但具体使用的算法由RTL设计工程师决定,其中两个最常用的算法是固定优先级算法和循环制算法。AHB总线上最多可以有16个主模块和任意多个从模块,如果主模块数目大于16,则需再加一层结构(具体参阅ARM公司推出的Multi-layer AHB规范)。APB 桥既是APB总线上唯一的主模块,也是AHB系统总线上的从模块。其主要功能是锁存来自AHB系统总线的地址、数据和控制信号,并提供二级译码以产生APB外围设备的选择信号,从而实现AHB协议到APB协议的转换。 
  AHB简介
  AHB主要用于高性能模块(如CPU、DMA和DSP等)之间的连接,作为SoC的片上系统总线,它包括以下一些特性:单个时钟边沿操作;非三态的实现方式;支持突发传输;支持分段传输;支持多个主控制器;可配置32位~128位总线宽度;支持字节、半字节和字的传输。AHB 系统由主模块、从模块和基础结构(Infrastructure)3部分组成,整个AHB总线上的传输都由主模块发出,由从模块负责回应。基础结构则由仲裁器(arbiter)、主模块到从模块的多路器、从模块到主模块的多路器、译码器(decoder)、虚拟从模块(dummy Slave)、虚拟主模块(dummy Master)所组成。
  APB简介
  APB主要用于低带宽的周边外设之间的连接,例如UART、1284等,它的总线架构不像AHB支持多个主模块,在APB里面唯一的主模块就是APB 桥。其特性包括:两个时钟周期传输;无需等待周期和回应信号;控制逻辑简单,只有四个控制信号。
  1)系统初始化为IDLE状态,此时没有传输操作,也没有选中任何从模块。
  2)当有传输要进行时,PSELx=1,PENABLE=0,系统进入SETUP状态,并只会在SETUP 状态停留一个周期。当PCLK的下一个上升沿时到来时,系统进入ENABLE 状态。
  3)系统进入ENABLE状态时,维持之前在SETUP 状态的PADDR、PSEL、PWRITE不变,并将PENABLE置为1。传输也只会在ENABLE状态维持一个周期,在经过SETUP与ENABLE状态之后就已完成。之后如果没有传输要进行,就进入IDLE状态等待;如果有连续的传输,则进入SETUP状态。
0
回复
dulai1985
LV.10
10
2013-07-25 12:27
@dulai1985
AHB  随着深亚微米工艺技术日益成熟,集成电路芯片的规模越来越大。数字IC从基于时序驱动的设计方法,发展到基于IP复用的设计方法,并在SOC设计中得到了广泛应用。在基于IP复用的SoC(SystemonChip的缩写,称为系统级芯片,也有称片上系统)设计中,片上总线设计是最关键的问题。为此,业界出现了很多片上总线标准。其中,由ARM公司推出的AMBA片上总线受到了广大IP开发商和SoC系统集成者的青睐,已成为一种流行的工业标准片上结构。AMBA规范主要包括了AHB(AdvancedHighperformanceBus)系统总线和APB(AdvancedPeripheralBus)外围总线。   AMBA片上总线  AMBA2.0规范包括四个部分:AHB、ASB、APB和TestMethodology。AHB的相互连接采用了传统的带有主模块和从模块的共享总线,接口与互连功能分离,这对芯片上模块之间的互连具有重要意义。AMBA已不仅是一种总线,更是一种带有接口模块的互连体系。  基于AMBA的片上系统  大多数挂在总线上的模块(包括处理器)只是单一属性的功能模块:主模块或者从模块。主模块是向从模块发出读写操作的模块,如CPU,DSP等;从模块是接受命令并做出反应的模块,如片上的RAM,AHB/APB桥等。另外,还有一些模块同时具有两种属性,例如直接存储器存取(DMA)在被编程时是从模块,但在系统读传输数据时必须是主模块。如果总线上存在多个主模块,就需要仲裁器来决定如何控制各种主模块对总线的访问。虽然仲裁规范是AMBA总线规范中的一部分,但具体使用的算法由RTL设计工程师决定,其中两个最常用的算法是固定优先级算法和循环制算法。AHB总线上最多可以有16个主模块和任意多个从模块,如果主模块数目大于16,则需再加一层结构(具体参阅ARM公司推出的Multi-layerAHB规范)。APB桥既是APB总线上唯一的主模块,也是AHB系统总线上的从模块。其主要功能是锁存来自AHB系统总线的地址、数据和控制信号,并提供二级译码以产生APB外围设备的选择信号,从而实现AHB协议到APB协议的转换。   AHB简介  AHB主要用于高性能模块(如CPU、DMA和DSP等)之间的连接,作为SoC的片上系统总线,它包括以下一些特性:单个时钟边沿操作;非三态的实现方式;支持突发传输;支持分段传输;支持多个主控制器;可配置32位~128位总线宽度;支持字节、半字节和字的传输。AHB系统由主模块、从模块和基础结构(Infrastructure)3部分组成,整个AHB总线上的传输都由主模块发出,由从模块负责回应。基础结构则由仲裁器(arbiter)、主模块到从模块的多路器、从模块到主模块的多路器、译码器(decoder)、虚拟从模块(dummySlave)、虚拟主模块(dummyMaster)所组成。  APB简介  APB主要用于低带宽的周边外设之间的连接,例如UART、1284等,它的总线架构不像AHB支持多个主模块,在APB里面唯一的主模块就是APB桥。其特性包括:两个时钟周期传输;无需等待周期和回应信号;控制逻辑简单,只有四个控制信号。  1)系统初始化为IDLE状态,此时没有传输操作,也没有选中任何从模块。  2)当有传输要进行时,PSELx=1,PENABLE=0,系统进入SETUP状态,并只会在SETUP状态停留一个周期。当PCLK的下一个上升沿时到来时,系统进入ENABLE状态。  3)系统进入ENABLE状态时,维持之前在SETUP状态的PADDR、PSEL、PWRITE不变,并将PENABLE置为1。传输也只会在ENABLE状态维持一个周期,在经过SETUP与ENABLE状态之后就已完成。之后如果没有传输要进行,就进入IDLE状态等待;如果有连续的传输,则进入SETUP状态。
0
回复
dulai1985
LV.10
11
2013-07-25 13:05
@dulai1985
[图片]AHB、APB总线 

 


0
回复
dulai1985
LV.10
12
2013-07-25 13:13
@dulai1985
[图片] 

  

0
回复
07611128
LV.2
13
2013-07-25 23:24
@dulai1985
[图片] 

师长啊,有点小乱啊……

0
回复
dulai1985
LV.10
14
2013-07-26 08:44
@07611128
师长啊,有点小乱啊……

说了这是学习笔记

自己不懂的地方才发出来的哈哈~~~

0
回复
dulai1985
LV.10
15
2013-07-31 13:21
@dulai1985
说了这是学习笔记自己不懂的地方才发出来的哈哈~~~
#if(C# 参考) 
如果 C# 编译器遇到最后面跟有 #endif 指令的 #if 指令,则仅当指定的符号已定义时,它才会编译这两个指令之间的代码。 与 C 和 C++ 不同,您不能对符号赋予数值;C# 中的 #if 语句是 Boolean,仅测试符号是否已定义。 例如,  复制  
#define DEBUG // ... #if DEBUG 
    Console.WriteLine("Debug version"); #endif 
使用运算符 ==(相等)和 !=(不相等)只能测试出结果为 true 还是 false。 True 表示符号已定义。 语句 #if DEBUG 与 #if (DEBUG == true) 的含义相同。 运算符 &&(与)和 ||(或)可用来评估多个符号是否已定义。 还可以用括号将符号和运算符分组。  
 
结合使用 #if 与 #else、#elif、#endif、#define 和 #undef 指令,可以根据一个或多个符号是否存在来包含或排除代码。 在编译调试版本的代码或针对特定配置进行编译时,这会很有用。  以 #if 指令开始的条件指令必须用 #endif 指令显式终止。  
#define 使您可以定义一个符号,通过将该符号用作传递给 #if 指令的表达式,使该表达式计算为 true。  
也可以用 /define 编译器选项来定义符号。 可以用 #undef 来取消定义符号。  
用 /define 或 #define 定义的符号与具有同一名称的变量不冲突。 即,不应将变量名传递到预处理器指令,并且只能用预处理器指令计算符号。  
用 #define 创建的符号的范围是在其中定义该符号的文件。  
示例  
 
复制  
// preprocessor_if.cs #define DEBUG #define MYTEST using System; 
public class MyClass  { 

   static void Main()      { 
#if (DEBUG && !MYTEST) 
        Console.WriteLine("DEBUG is defined"); #elif (!DEBUG && MYTEST) 
        Console.WriteLine("MYTEST is defined"); #elif (DEBUG && MYTEST) 
        Console.WriteLine("DEBUG and MYTEST are defined"); #else 
        Console.WriteLine("DEBUG and MYTEST are not defined"); #endif     } }  
#endif(C# 参考) 
#endif 指定以 #if 指令开头的条件指令的结尾。 例如,  
#define DEBUG // ... #if DEBUG 
    Console.WriteLine("Debug version"); #endif 
以 #if 指令开始的条件指令必须用 #endif 指令显式终止。 有关如何使用 #endif 的示例参见#if
0
回复
dulai1985
LV.10
16
2013-08-01 08:56
 UPD6121G产生的遥控编码是连续的32位二进制码组,其中前16位为用户识别码,能区别不同的电器设备,防止不同机种遥控码互相干扰。该芯片的用户识别码固定为十六进制01H;后16位为8位操作码(功能码)及其反码。UPD6121G最多额128种不同组合的编码。 
    遥控器在按键按下后,周期性地发出同一种32位二进制码,周期约为108ms。一组码本身的持续时间随它包含的二进制“0”和“1”的个数不同而不同,大约在45~63ms之间,图4为发射波形图。 
     当一个键按下超过36ms,振荡器使芯片激活,将发射一组108ms的编码脉冲,这108ms发射代码由一个起始码(9ms),一个结果码(4.5ms),低8位地址码(9ms~18ms),高8位地址码(9ms~18ms),8位数据码(9ms~18ms)和这8位数据的反码(9ms~18ms)组成。如果键按下超过108ms仍未松开,接下来发射的代码(连发代码)将仅由起始码(9ms)和结束码(2.5ms)组成。 
代码格式(以接收代码为准,接收代码与发射代码反向) 
        ①位定义 
      
 
单发代码格式 
 

 
连发代码格式 
 
 
注:代码宽度算法: 16位地址码的最短宽度:1.12×16=18ms 
16位地址码的最长宽度:2.24ms×16=36ms 
易知8位数据代码及其8位反代码的宽度和不变:(1.12ms+2.24ms)×8=27ms 
∴32位代码的宽度为(18ms+27ms~(36ms+27ms) 

1. 解码的关键是如何识别“0”和“1”,从位的定义我们可以发现“0”、“1”均以0.56ms的低电平开始,不同的是高电平的宽度不同,“0”为0.56ms,“1”为1.68ms,所以必须根据高电平的宽度区别“0”和“1”。如果从0.56ms低电平过后,开始延时,0.56ms以后,若读到的电平为低,说明该位为“0”,反之则为“1”,为了可靠起见,延时必须比0.56ms长些,但又不能超过1.12ms,否则如果该位为“0”,读到的已是下一位的高电平,因此取(1.12ms+0.56ms)/2=0.84ms最为可靠,一般取0.84ms左右均可。 
2. 根据码的格式,应该等待9ms的起始码和4.5ms的结果码完成后才能读码。 
 
     如果邮购我们开发的51单片机试验板和扩展元件的网友,可以获得如上图所示的红外遥控手柄,这种遥控器的编码格式符合上面的描述规律,而且价格低廉,有32个按键,按键外形比较统一,如果用于批量开发,可以把遥控器上贴膜换成你需要的字符,这为开发产品提供了便利。 
0
回复
619216213
LV.5
17
2013-08-01 21:37
给一楼正下楼,stm32寄存器操作模版,自己写的,流水灯测试程序,想要写别的功能自己修改就行stm32寄存器操作模版 
0
回复
dulai1985
LV.10
18
2013-08-02 08:33
@619216213
给一楼正下楼,stm32寄存器操作模版,自己写的,流水灯测试程序,想要写别的功能自己修改就行[图片]stm32寄存器操作模版 

谢谢~~嘿嘿

我这里有很多模块程序

我只是想慢慢的学起来

慢慢的了解这款芯片的硬件资源~~~

不过还是谢谢~~

有什么问题,一定会请教

能不能留个联系方式啊~~

0
回复
123sky
LV.2
19
2013-08-02 15:56
@dulai1985
谢谢~~嘿嘿我这里有很多模块程序我只是想慢慢的学起来慢慢的了解这款芯片的硬件资源~~~不过还是谢谢~~有什么问题,一定会请教能不能留个联系方式啊~~
可有spwm的模块程序?
0
回复
cunwmy
LV.2
20
2013-08-19 22:08
@dulai1985
(2)一个在core_m3.h中 /*SysTickControl/StatusRegisterDefinitions*/定义COUNTFLAG在SysTick_CTRL寄存器中的位置 #defineSysTick_CTRL_COUNTFLAG_Pos    16  #defineSysTick_CTRL_COUNTFLAG_Msk  (1ul

LZ帮忙讲解一下RTOS吧。

0
回复
dulai1985
LV.10
21
2013-08-20 10:13
@cunwmy
LZ帮忙讲解一下RTOS吧。
嘿嘿,我也是初学者~~~
0
回复
2013-09-02 17:59
@123sky
可有spwm的模块程序?
这个我没有啊!
0
回复
dulai1985
LV.10
23
2013-09-28 10:29
@阿信博客
这个我没有啊!

Intel HEX 文件是由一行行符合Intel HEX 文件格式的文本所  成的ASCII 文本文件。在Intel HEX 文件中,每一行包含一  HEX 记录    记录 对应 机器    / 或常量  据的十六   编码数   成。Intel HEX 文件通常用于 传输将 被存于ROM 或者EPROM 中的程序和  据。大多 EPROM  程器或模 拟器使用Intel HEX 文件。
记录 格式
Intel HEX
 由任意数量的十六   记录组 成。每 个记录 包含5  域, 它们按以下格式排列:
:llaaaatt[dd...]cc
每一组字母 对应   不同的域,每一  字母 对应   十六   编码   字。每一  域由至少 两个 十六   编码数   成, 它们构 成一   ,就像以下描述的那 样:


每个Intel HEX 记录 都由冒 号开头 .
ll     度域,  代表 记录当   据字  (dd)  数量 .
aaaa 
是地址域, 它代表 记录当  数据的起始地址 . 
tt 
是代表HEX 记录类 型的域 ,  可能是以下    中的一 个:
    00 –   记录
    01 – 文件  记录
    02 – 扩展段地址 记录
    04 – 扩 线 性地址 记录
dd 是 据域 ,  代表一      . 一 个记录 可以有    据字  . 记录当   据字    量必      度域(ll) 中指定的 数字相符.
cc 
是校验 和域 ,  表示 这个记录 的校  . 校  和的  算是通 过将记录当 中所有十六   编码数     相加, 以256    行以下 .

表示为:“:[1字节长度][4字节地址][1字节记录类型][数据段][校验和] ”


  记录
Intel HEX文件由任意 量以回 车换 行符  束的   记录组 .   记录  观如下:
:10246200464C5549442050524F46494C4500464C33
其中:
10 
是这个记录当  据字   数量.即0x10 
2462 
是数  被下  到存   当中的地址.即0x2462 
00 
是记录类(   记录).即0x00 
464C…464C 数据.分别代表0x46,0x4C... 
33 
是这个记录的校 验和.即0x33


 线 性地址 记录(HEX386)
  线 性地址 记录 也叫作32 位地址 记录 HEX386 记录 .   记录 包含  据地址的高16 位.   线 性地址 记录总 是有 两个数 据字  ,  观如下:
:02000004FFFFFC
其中:
02 
是这个记录当  据字   数量.
0000 
是地址域, 对   线 性地址 记录 , 这个  总是0000.
04 
是记录类 04(   线 性地址 记录)
FFFF 是地址的高16 位.
FC 
是这个记录的校  , 计算方法如下:
01h + NOT(02h + 00h + 00h + 04h + FFh + FFh).
 个扩  线 性地址 记录   , 存    据域的   线 性地址被保存,    用于  Intel HEX 文件      后的 记录 . 线 性地址保持有效, 直到  被另外一 个扩 展地址 记录 所改 变.
   记录当 中的地址域  被移位的     线 性地址 记录 的地址  据相加     记录  绝对  储器地址.
以下的例子演示了这个过 程..
   记录地址域的地址                       2462
 线 性地址 记录  数据域                      + FFFF
                                  ------------
绝对  器地址                               FFFF2462

 展段地址 记录(HEX86)
 展段地址 记录 也叫HEX86 记录 ,  包括4-19 位  据地址段.  展段地址 记录总 是有 两个数 据字  ,  观如下:
:020000021200EA
其中:
02 
是记录当  据字   数量.
0000 
是地址域. 对  展段地址 记录 , 这个  总是0000.
02 
是记录类 02(  展段地址 记录)
1200 是地址段.
EA 
是这个记录的校  , 计算方法如下:
01h + NOT(02h + 00h + 00h + 02h + 12h + 00h).
 个扩 展段地址 记录   , 存    据域的  展段地址被保存,    用于  Intel HEX 文件      后的 记录 . 段地址保持有效,直到  被另外一 个扩 展地址 记录 所改 变.
   记录当 中的地址域  被移位的    展段地址 记录 的地址  据相加     记录  绝对  储器地址.
以下的例子演示了这个过 程..
   记录地址域的地址                             2462
展段地址 记录数据域                      +  1200
                                 ---------
绝对  器地址                    00014462

文件  (EOF) 记录
Intel HEX文件必 以文件  (EOF) 记录结 . 这个记录  记录类 型域的    01.EOF 记录  观总是如下:
:00000001FF
其中:
00 
是记录当  据字   数量.
0000 
是数据被下  到存    中的地址. 在文件   记录当 中地址是  有意 义被忽略的.0000h 是典型的地址.
01 
是记录类 01( 文件   记录)
FF  这个记录 的校  , 计算方法如下:
01h + NOT(00h + 00h + 00h + 01h).


Intel HEX
 文件例子:
下面是一 完整的Intel HEX 文件的例子:
:10001300AC12AD13AE10AF1112002F8E0E8F0F2244
:10000300E50B250DF509E50A350CF5081200132259
:03000000020023D8
:0C002300787FE4F6D8FD7581130200031D
:10002F00EFF88DF0A4FFEDC5F0CEA42EFEEC88F016
:04003F00A42EFE22CB
:00000001FF

0
回复
dulai1985
LV.10
24
2013-09-28 11:08
@dulai1985
IntelHEX 文件是由一行行符合IntelHEX 文件格式的文本所 构 成的ASCII 文本文件。在IntelHEX 文件中,每一行包含一 个 HEX 记录 。 这 些 记录由 对应 机器 语 言 码 和/ 或常量 数 据的十六 进 制 编码数 字 组 成。IntelHEX 文件通常用于 传输将 被存于ROM 或者EPROM 中的程序和 数 据。大多数 EPROM 编 程器或模 拟器使用IntelHEX 文件。记录 格式IntelHEX 由任意数量的十六 进 制 记录组 成。每 个记录 包含5 个 域, 它们按以下格式排列::llaaaatt[dd...]cc每一组字母 对应 一 个 不同的域,每一 个 字母 对应 一 个 十六 进 制 编码 的 数 字。每一 个 域由至少 两个 十六 进 制 编码数 字 组 成, 它们构 成一个 字 节 ,就像以下描述的那 样:: 每个IntelHEX 记录 都由冒 号开头 .ll 是 数 据 长 度域, 它 代表 记录当 中 数 据字 节 (dd) 的 数量 .aaaa 是地址域, 它代表 记录当 中 数据的起始地址 . tt 是代表HEX 记录类 型的域 , 它 可能是以下 数 据 当 中的一 个:   00– 数 据 记录   01–文件结 束 记录   02–扩展段地址 记录   04–扩展 线 性地址 记录dd是数 据域 , 它 代表一 个 字 节 的 数 据. 一 个记录 可以有 许 多 数 据字 节 . 记录当 中 数 据字 节 的 数 量必 须 和 数 据 长 度域(ll) 中指定的 数字相符.cc 是校验 和域 , 它 表示 这个记录 的校 验 和. 校 验 和的 计 算是通 过将记录当 中所有十六 进 制 编码数 字 对 的 值 相加, 以256 为 模 进 行以下 补足.表示为:“:[1字节长度][4字节地址][1字节记录类型][数据段][校验和] ”数 据 记录IntelHEX文件由任意数 量以回 车换 行符 结 束的 数 据 记录组 成. 数 据 记录 外 观如下::10246200464C5549442050524F46494C4500464C33其中:10 是这个记录当中 数 据字 节 的 数量.即0x10 2462 是数据 将 被下 载 到存 储 器 当中的地址.即0x2462 00 是记录类型( 数 据 记录).即0x00 464C…464C是 数据.分别代表0x46,0x4C... 33 是这个记录的校 验和.即0x33扩展 线 性地址 记录(HEX386)扩 展 线 性地址 记录 也叫作32 位地址 记录 或HEX386 记录 . 这 些 记录 包含 数 据地址的高16 位. 扩 展 线 性地址 记录总 是有 两个数 据字 节 , 外 观如下::02000004FFFFFC其中:02 是这个记录当中 数 据字 节 的 数量.0000 是地址域, 对于 扩 展 线 性地址 记录 , 这个 域 总是0000.04 是记录类型 04( 扩 展 线 性地址 记录)FFFF是地址的高16 位.FC 是这个记录的校 验 和, 计算方法如下:01h+NOT(02h+00h+00h+04h+FFh+FFh).当一 个扩 展 线 性地址 记录 被 读 取, 存 储 于 数 据域的 扩 展 线 性地址被保存, 它 被 应 用于 从 IntelHEX 文件 读 取 来 的 随 后的 记录 . 线 性地址保持有效, 直到 它 被另外一 个扩 展地址 记录 所改 变.通 过 把 记录当 中的地址域 与 被移位的 来 自 扩 展 线 性地址 记录 的地址 数 据相加 获 得 数 据 记录 的 绝对 存 储器地址.以下的例子演示了这个过 程..来自 数 据 记录地址域的地址             2462扩展 线 性地址 记录 的 数据域            +FFFF                      ------------绝对存 储 器地址                     FFFF2462扩 展段地址 记录(HEX86)扩 展段地址 记录 也叫HEX86 记录 , 它 包括4-19 位 数 据地址段. 扩 展段地址 记录总 是有 两个数 据字 节 , 外 观如下::020000021200EA其中:02 是记录当中 数 据字 节 的 数量.0000 是地址域. 对于 扩 展段地址 记录 , 这个 域 总是0000.02 是记录类型 02( 扩 展段地址 记录)1200是地址段.EA 是这个记录的校 验 和, 计算方法如下:01h+NOT(02h+00h+00h+02h+12h+00h).当一 个扩 展段地址 记录 被 读 取, 存 储 于 数 据域的 扩 展段地址被保存, 它 被 应 用于 从 IntelHEX 文件 读 取 来 的 随 后的 记录 . 段地址保持有效,直到 它 被另外一 个扩 展地址 记录 所改 变.通 过 把 记录当 中的地址域 与 被移位的 来 自 扩 展段地址 记录 的地址 数 据相加 获 得 数 据 记录 的 绝对 存 储器地址.以下的例子演示了这个过 程..来自 数 据 记录地址域的地址                2462扩展段地址 记录数据域            +  1200                      ---------绝对存 储 器地址              00014462文件 结 束(EOF) 记录IntelHEX文件必须 以文件 结 束(EOF) 记录结 束. 这个记录 的 记录类 型域的 值 必 须 是01.EOF 记录 外 观总是如下::00000001FF其中:00 是记录当中 数 据字 节 的 数量.0000 是数据被下 载 到存 储 器 当 中的地址. 在文件 结 束 记录当 中地址是 没 有意 义被忽略的.0000h 是典型的地址.01 是记录类型 01( 文件 结 束 记录)FF 是 这个记录 的校 验 和, 计算方法如下:01h+NOT(00h+00h+00h+01h).IntelHEX 文件例子:下面是一个 完整的IntelHEX 文件的例子::10001300AC12AD13AE10AF1112002F8E0E8F0F2244:10000300E50B250DF509E50A350CF5081200132259:03000000020023D8:0C002300787FE4F6D8FD7581130200031D:10002F00EFF88DF0A4FFEDC5F0CEA42EFEEC88F016:04003F00A42EFE22CB:00000001FF
0
回复
dulai1985
LV.10
25
2013-10-24 15:47
@dulai1985
[图片]常用ASCII码详细对照表_0-255号 [图片]字符编码 [图片]ASCII码表(0-255) [图片]ASCII码表完整版 [图片]ASCII码表完整版 

下面开始学习用库函数来学习串口通讯协议

从STM32手册上看到了智能卡协议:

智能卡通信协议破解智能卡的基础知识(转)

 
智能卡无线小板相对于串口无线小板最大的不同是智能卡无线小板上的单片机要模仿真正的智能卡来发送和接收机顶盒的数据,这部分功能将直接决定整个无线GX系统的稳定性。
智能卡常用的通信协议有T0、T1和T14协议,关于这三种通信协议完整的介绍,在很多资料上都能找到,本文不再详细阐述,有兴趣的朋友可以查阅相关书籍。
本章节主要介绍BJST、YXTF、SMSX这三种智能卡的通信协议的关键技术和机顶盒智能卡命令、应答具体格式以及详细说明。
首先介绍一下ATR(Answer To Reset,复位应答)。
当加上供电电压、时钟和复位信号后,智能卡经DATA线送出其复位应答ATR。这个数据串最多含有33字节,总是按分频值(时钟频率转换因子)为372传送的,
这是遵照ISO/IEC7816-3标准的规定。它含有关于传输协议和卡的各种数据,即使在ATR之后的传输协议使用的是不同的分频值(例如:512),也应当用372这个分频值来发送ATR。
这就保证了从任何卡总能接收到一个ATR,而不管传输协议的参数是怎样的。需要大家注意的是,这里强调的是发送ATR的分频值总是372,但是并没有说发送ATR的波特率是固定的,波特率还要看机顶盒的智能卡槽的时钟频率是多少,ATR的波特率 = 机顶盒所加时钟频率/372。常用的机顶盒的智能卡槽的时钟频率有4.515MHz、4.9152MHz和3.5712MHz。
YXTF、 SMSX智能卡用到的是标准的T0协议。BJST所使用的协议类似于T1协议,单不是标准的T1协议,是一种介于T0协议和T1协议之间的协议,我们暂时称之为TN协议。根据调试的经验,这三种智能卡都有一个规律:发送ATR的波特率和ATR之后的机顶盒命令、智能卡应答的波特率相同。
下面我们来看YXTF智能卡命令和应答(按时间先后顺序)。
STB:机顶盒。
Card:智能卡。
STB -> Card:机顶盒发送给智能卡。
Card -> STB:智能卡发送给机顶盒。

智能卡命令或应答
传输方向,命令或应答的详细说明

0x3b 0x6c 0x00 0x00 0x4e 0x54 0x49 0x43 0x30 0x91 0x69 0x00 0x4a 0x03 0x00 0x00
Card -> STB。YXTF的ATR。

0x00 0xa4 0x04 0x00 0x05 0xf9 0x5a 0x54 0x00 0x06
STB -> Card。初始命令。

0x90 0x00
Card -> STB。表示智能卡收到了正确的初始命令

0x80 0x46 0x00 0x00 0x040x01 0x00 0x00 0x04
STB -> Card。获取智能卡号码命令。

0x61 0x04
Card -> STB。告知机顶盒号码占用0x04个字节。

0x00 0xc0 0x00 0x00 0x04
STB -> Card。读取智能卡号码。

0xaa 0xbb 0xcc 0xdd0x90 0x00
Card -> STB。告知机顶盒智能卡号码,并以0x90 0x00结尾告知机顶盒获取智能卡号码的命令被完整而成功地执行。

0x80 0x46 0x00 0x00 0x040x03 0x00 0x00 0x09
STB -> Card。获取智能卡年龄等级命令。

0x61 0x09
Card -> STB。告知机顶盒年龄等级信息占用0x09个字节

0x00 0xc0 0x00 0x00 0x09
STB -> Card。读取智能卡年龄等级信息。

0x30 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x000x90 0x00
Card -> STB。告知机顶盒智能卡年龄等级信息,并以0x90 0x00结尾告知机顶盒获取智能卡年龄等级的命令被完整而成功地执行。

0x80 0x44 0x00 0x00 0x08
STB -> Card。读取智能卡运营商信息。

0x17 0x17 0x00 0x00 0x00 0x0a 0x00 0x00 0x90 0x00
Card -> STB。告知机顶盒运营商信息,例如0x1717十进制为5911,表示第一个运营商是电话区号为0591的第一个城市。并以0x90 0x00结尾告知机顶盒获取智能卡年龄等级的命令被完整而成功地执行。

0x80 0x4c 0x00 0x00 0x040xff 0xff 0xff 0xff
STB -> Card。检查智能卡是否需要机卡配对。

0x94 0xb2
Card -> STB。如果为0x94 0xb2,说明此卡需要机卡配对。如果为0x94 0xb1,说明此卡不需要机卡配对。

0x80 0x4c 0x00 0x00 0x040x5e 0xe4 0x82 0xf2
STB -> Card。给卡发送四个配对字节:0x5e 0xe4 0x82 0xf2,看是否能配对成功

0x90 0x00
Card -> STB。如果为0x90 0x00,说明四个配对字节与此卡配对成功。如果回复其他数据,说明配对失败。

0x80 0x46 0x17 0x17 0x040x04 0x00 0x00 0x48
STB -> Card。获取运营商一产品包列表。其中0x17 0x17是运营商一的号码。

0x61 0x48
Card -> STB。告知机顶盒运营商一产品包列表占用0x48个字节

0x00 0xc0 0x00 0x00 0x48
STB -> Card。读取运营商一产品包列表。

0x00….. 0x00(共0x48个) 0x90 0x00
Card -> STB。返回运营商一产品包列表。并以0x90 0x00结尾告知机顶盒获取运营商一产品包列表的命令被完整而成功地执行。

0x80 0x48 0x17 0x17 0x040x81 0x00 0x00 0x3e
STB -> Card。获取运营商一授权信息。其中0x17 0x17是运营商一的号码。

0x61 0x27
Card -> STB。告知机顶盒运营商一授权信息占用0x27个字节

0x00 0xc0 0x00 0x00 0x27
STB -> Card。读取运营商一授权信息。

0x00 0x00 0x09 0x00 0x00 0x00 0x00
0x00 0x00 0x00 0x01 0x00 0x00 0x01 0x00
0x00 0x00 0x80 0x00 0x00 0x01 0xff 0xfe
0x00 0x00 0x00 0x02 0x00 0x01 0x00 0x01
0x00 0x01 0x00 0x02 0x00 0x01 0x00 0x040x90 0x00
Card -> STB。返回机顶盒运营商一授权信息。其中前三个字节0x00 0x00 0x09表示授权信息共有0x09条,以后每四个字节作为一条授权信息。例如0x00 0x01 0xff 0xfe表示ID号为65534(0xff fe)的节目,第二个字节0x01表示在界面上显示此节目ID,第二个字节为0x00表示不显示。

0x80 0x46 0x00 0x0a 0x040x04 0x00 0x00 0x48
STB -> Card。获取运营商二产品包列表。其中0x00 0x0a是运营商二的号码。

0x61 0x48
Card -> STB。告知机顶盒运营商二产品包列表占用0x48个字节

0x00 0xc0 0x00 0x00 0x48
STB -> Card。读取运营商二产品包列表。

0x00….. 0x00(共0x48个) 0x90 0x00
Card -> STB。返回运营商二产品包列表。并以0x90 0x00结尾告知机顶盒获取运营商二产品包列表的命令被完整而成功地执行。

0x80 0x48 0x00 0x0a 0x040x81 0x00 0x00 0x3e
STB -> Card。获取运营商二授权信息。其中0x00 0x0a是运营商二的号码。

0x61 0x0b
Card -> STB。告知机顶盒运营商二授权信息占用0x0b个字节

0x00 0xc0 0x00 0x00 0x0b
STB -> Card。读取运营商二授权信息。

0x00 0x00 0x02 0x00 0x00 0x00 0x00
0x00 0x00 0x00 0x010x90 0x00
Card -> STB。返回机顶盒运营商一授权信息。其中前三个字节0x00 0x00 0x02表示授权信息共有0x02条。分析方法同上面运营商一授权信息的分析方法。


上面是一个智能卡初始化比较全面的例子。一般的机顶盒不会有这么多初始化命令。
需要说明以下几点:
第一, T0协议的长度字节在第五个字节,长度字节加上5是整个命令的长度。

第二,按照T0协议,机顶盒首先发送命令的前五个字节,等收到了PB(过程字节)之后,再发送后面的字节。不足五个字节的命令一次发完。以读取卡号的命令为例,第一步机顶盒先发送0x80 0x46 0x00 0x00 0x04;第二步智能卡选取第二个字节0x46作为过程字节回复机顶盒;第三步机顶盒再发送后面四个字节0x01 0x00 0x00 0x04;第四步智能卡回复0x61 0x04表示收到了机顶盒命令并成功执行,返回0x04表示卡号信息是四个字节;第五步机顶盒发送0x00 0xc0 0x00 0x00 0x04来读取卡号;第六步智能卡选取第二个字节0x0c作为过程字节回复机顶盒;第七步智能卡发送卡号信息0xaa 0xbb 0xcc 0xdd  0x90 0x00,以0x90 0x00结尾表示收到了机顶盒命令并成功执行。

第三,智能卡接收到五个字节回复第二个字节作为过程字节,然后如何判断这个命令是否已经结束呢?方法是看开头是否是0x00 0xc0开头,如果是,此命令就是长度就是5,智能卡已经收到了完整的数据了。比如读取卡号命令0x00 0xc0 0x00 0x00 0x04,智能卡需要回复0x04个字节的卡号信息;如果不是0x00 0xc0开头,比如0x80 0x46 0x00 0x00 0x04,说明这个命令还有0x04要发。当然也有一个例外,获取运营商命令0x80 0x44 0x00 0x00 0x08,只有五个字节。我们在单片机程序设计中采用了这种方法。

第四,机卡配对技术将作为单独的一章在后文中做详细介绍。

机顶盒对智能卡完成这些初始化的“问题”后,就开始发送ECM。

0x80 0x3a 0x17 0x17 0x53

0xd6 0x2f 0xc0 0x44 0x0f 0x37 0x94 0x7d 0x02 0xba 0xe0 0x6e 0xa3 0x63 0x17 0x30 0xb3 0x8e 0x82 0x5b 0x81 0x9d 0xd9 0x95 0x4d 0xb0 0xd7 0x0d 0x9f 0x51 0xb6 0x57 0x02 0x09 0x00 0x01 0x00 0x01 0xd1 0x8f 0xaa 0x31 0xbe 0x44 0xae 0x40 0x8b 0x2b 0x45 0x12 0xda 0xce 0x50 0x33 0x09 0x00 0x01 0x00 0x03 0x1f 0xc9 0xf9 0xbb 0x80 0x9a 0x10 0x88 0x11 0xd4 0x5d 0x67 0xf9 0x3f 0x30 0x12 0x47 0x5b 0xfb 0x51 0x65 0x20 0x34 0x51

STB -> Card。ECM,共88字节。0x17 0x17是运营商号。


0x61 0x2b

Card -> STB。告知机顶盒运CW共0x2b个字节,让机顶盒来读取。


0x00 0xc0 0x00 0x00 0x2b

STB -> Card。机顶盒读取CW命令。


0x0a 0x17 0x17 0x44 0x0f 0x37 0x94 0x7d 0xab 0xec 0xe1 0x78 0x14 0x58 0xae 0x1a 0x4f 0xec 0x8d 0xc8 0x50 0x3c 0xbb 0x47 0x00 0x0c 0x5e 0x00 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00

Card -> STB。CW。0xab 0xec 0xe1 0x78 0x14 0x58 0xae 0x1a 0x4f 0xec 0x8d 0xc8 0x50 0x3c 0xbb 0x47是用来解节目的有效数据。

如果用户访问运营商授权信息页面,还有有以下的命令和回复。

智能卡命令或应答
传输方向,命令或应答的详细说明

0x80 0x46 0x00 0x0a 0x040x02 0x00 0x00 0x16
STB -> Card。获取运营商二信息的命令。

0x61 0x16
Card -> STB。

0x00 0xc0 0x00 0x00 0x16
STB -> Card。读取运营商二信息的命令。

0x00 0x0a 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x000x90 0x00
Card -> STB。告知机顶盒运营商二信息。

0x80 0x46 0x17 0x17 0x040x02 0x00 0x00 0x16
STB -> Card。获取运营商一信息的命令。

0x61 0x16
Card -> STB。

0x00 0xc0 0x00 0x00 0x16
STB -> Card。读取运营商一信息的命令。

0x17 0x17 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x000x90 0x00
Card -> STB。告知机顶盒运营商一信息。

0x80 0x48 0x00 0x0a 0x040x01 0x00 0x00 0x13
STB -> Card。获取运营商二授权信息。

0x61 0x1d
Card -> STB。

0x00 0xc0 0x00 0x00 0x1d
STB -> Card。读取运营商二授权信息。

0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x00 0x0c 0xd9 0x00 0x00 0x36 0x38 0xbf 0x7d 0x00 0x00 0x00 0x01 0x00 0x0b 0xe7 0x51 0xa6 0x36 0x38 0xbf 0x7d0x90 0x00
Card -> STB。告知机顶盒运营商二授权信息。其中前三个字节0x00 0x00 0x02表示授权信息共有0x02条,以后每13个字节作为一条授权信息。具体解释同下面运营商一授权信息的解释。

0x80 0x48 0x00 0x0a 0x040x02 0x00 0x00 0x14
STB -> Card。获取运营商二未知信息。

0x61 0x03
Card -> STB。

0x00 0xc0 0x00 0x00 0x03
STB -> Card。读取运营商二未知信息。

0x00 0x00 0x000x90 0x00
Card -> STB。告知机顶盒运营商二未知信息。

0x80 0x48 0x17 0x17 0x040x01 0x00 0x00 0x13
STB -> Card。获取运营商一授权信息。

0x61 0x78
Card -> STB。

0x00 0x00 0x09 0x00 0x00 0x00 0x00 0x00 0x0c 0xd9 0x00 0x00 0x36 0x38 0xbf 0x7d 0x00 0x00 0x00 0x01 0x00 0x0b 0xe7 0x51 0xa6 0x36 0x38 0xbf 0x7d 0x00 0x00 0x01 0x00 0x00 0x0e 0xdf 0x73 0x82 0x1d 0xf7 0xbf 0x7d 0x00 0x00 0x80 0x00 0x00 0x0e 0xdf 0x73 0x82 0x1d 0xf7 0xbf 0x7d 0x00 0x01 0xff 0xfe 0x00 0x0e 0xdf 0x73 0x82 0x1d 0xf7 0xbf 0x7d 0x00 0x00 0x00 0x02 0x00 0x0e 0xdf 0x73 0x82 0x1d 0xf7 0xbf 0x7d 0x00 0x01 0x00 0x01 0x00 0x0e 0x49 0x73 0x82 0x1d 0xf7 0xbf 0x7d 0x00 0x01 0x00 0x02 0x00 0x0e 0x49 0x73 0x82 0x0f 0xb5 0xbf 0x7d 0x00 0x01 0x00 0x04 0x01 0x0e 0x3d 0x69 0x66 0x0f 0x4b 0x81 0xa50x90 0x00
Card -> STB。告知机顶盒运营商一授权信息。
其中前三个字节0x00 0x00 0x09表示授权信息共有0x09条,以后每13个字节作为一条授权信息。例如0x00 0x01 0xff 0xfe 0x00 0x0e 0xdf 0x73 0x82 0x1d 0xf7 0xbf 0x7d表示ID为65534(0xff fe)的节目授权开始时间为0x0e 0xdf 0x73 0x82,结束时间为0x1d 0xf7 0xbf 0x7d,要在界面上显示出来,没有购买录像。
第二个字节,0x01表示要在机顶盒运营商授权信息页面上显示,0x00表示不显示。
第五个字节,0x00表示此节目没有购买录像,0x01表示此节目购买了录像。

0x80 0x48 0x17 0x17 0x040x02 0x00 0x00 0x14
STB -> Card。获取运营商一未知信息。

0x61 0x03
Card -> STB。

0x00 0xc0 0x00 0x00 0x03
STB -> Card。读取运营商一未知信息。

0x00 0x00 0x000x90 0x00
Card -> STB。告知机顶盒运营商一未知信息。



下面我们来看SMSX智能卡命令和应答。SMSX与YXTF应答和命令比较相似。

0x3b 0x02 0x17 0x72

Card -> STB。SMSX的ATR。

0x00 0xa4 0x04 0x00 0x02

0x3f 0x00


STB -> Card。初始命令一。
0x90 0x00

Card -> STB。表示智能卡收到了正确的初始命令一

0x00 0xa4 0x04 0x00 0x02

0x4a 0x00


STB -> Card。初始命令二。

0x90 0x00

Card -> STB。表示智能卡收到了正确的初始命令二

0x00 0xb2 0x00 0x05 0x06

0x00 0x01 0xff 0x00 0x01 0xff


STB -> Card。获取智能卡号码命令。

0x61 0x67

Card -> STB。告知机顶盒号码信息占用0x67个字节。

0x00 0xc0 0x00 0x00 0x67

STB -> Card。读取智能卡号码命令。

0x00 0x01 0x64*

0x04 0x11 0x22 0x33*

0x83 0x50 0x11 0x06 0x82 0x31 0x73 0x13*

0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xca 0xfd 0xc2 0xeb 0xca 0xd3 0xd1 0xb6 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x33 0x00 0x00 0x02 0x0b 0x5c 0x4b 0xa7 0x09

0x90 0x00

Card -> STB。告知机顶盒智能卡号码,并以0x90 0x00结尾告知机顶盒获取智能卡号码的命令被完整而成功地执行。其中83 50 11 06 82 31 73 13表示完整的智能卡卡号,也就是智能卡背面的条形码号码。0x04 0x11 0x22 0x33换算成相应的十进制68231731表示卡号从倒数第二位到倒数第九位的部分。

0x80 0x32 0x00 0x00 0x44

0x81 0x30 0x41 0x00 0x04 0xce 0x66 0xa3 0x4c 0x7b 0x89 0x70 0x50 0xd4 0x6b 0xae 0x0c 0xb8 0xd8 0x53 0x2e 0x74 0x12 0x03 0x5b 0xcd 0xc7 0x66 0xf6 0x8f 0x0c 0x96 0xa0
0xa0 0xee 0x61 0xff 0x12 0xb2 0xa9 0xea
0xb3 0x16 0xef 0x5e 0xc8 0xf3 0x88 0xff
0x77 0x04 0x4d 0xf9 0x16 0xe0 0xac 0x90 0x97 0x73 0x6b 0x5e 0x24 0xee 0xfd 0xc6 0xbc 0xf4 0x71


STB -> Card。ECM,共73字节。
0x60 0x61 0x2a


Card -> STB。告知机顶盒运CW共0x2a个字节,让机顶盒来读取。
0x00 0xc0 0x00 0x00 0x2a

STB -> Card。机顶盒读取CW命令。
0x04 0xce 0x84 0x03 0x00 0x01 0x00 0x84 0x03 0x00 0x03 0xb0 0xb4 0x04 0x00 0x00 0x00 0x00 0x83 0x16 0xd6 0x31 0x03 0x80 *0xd0 0x8b 0x02 0x5d*0x00*0x42 0x29 0x86 0xf1 0x82 0x1c 0xfc 0x9a*0x00*0x3e 0x80 0x7c 0x3a

0x90 0x00


Card -> STB。CW。其中0xd0 0x8b 0x02 0x5d,0x42 0x29 0x86 0xf1 0x82 0x1c 0xfc 0x9a,0x3e 0x80 0x7c 0x3a是解加扰节目的关键数据。


BJST所使用的TN协议是一种介于T0和T1之间的协议,长度在第三个字节。这种协议不像T0协议那样需要多次发送命令多次回复才能得到一条信息,TN协议只需要一问一答就能获得一条信息。下面我们来看BJST智能卡命令和应答。


0x3b 0xe9 0x00 0x00 0x81 0x31 0xc3 0x45 0x99 0x63 0x74 0x69 0x19 0x99 0x12 0x56 0x10
0xec


Card -> STB。BJST的ATR。18字节。

0x00 0x00 0x05

0x00 0x84 0x00 0x00 0x10 0x91

STB -> Card。初始命令一。第三个字节0x05加上4是整个命令的长度,最后一个字节0x91是前面所有字节异或后得到的校验字节。

0x00 0x00 0x12

0xe4 0x74 0x27 0xee 0xd2 0x9d 0xb0 0x25 0x5e 0xa6 0x98 0x97 0xd6 0xbe 0x10 0xbe 0x90 0x00 0x30


Card -> STB。回复初始命令一。第三个字节0x12加上4是整个命令的长度。



0x00
0x00
0x0e

0x00 0x0c 0x00 0x00 0x10 0xe4 0x74 0x27 0xee
0xd2 0x9d
0xb0 0x25 0x56 0xc7


STB -> Card。初始命令二。



0x00 0x00 0x0a

0xf1 0x3d 0x02 0x84 0xcf 0x51 0x0e 0xe1 0x90 0x00 0xa1


Card -> STB。回复初始命令二。



0x00 0x00 0x0e

0x00 0x0b 0x00 0x00 0x10 0xf1 0x3d 0x02 0x84
0xcf 0x51 0x0e
0xe1 0x56
0x78


STB -> Card。初始命令三。



0x00 0x00 0x02

0x90 0x00 0x92


Card -> STB。回复初始命令三。



0x00 0x00 0x05

0x81 0xd4 0x00 0x01 0x05 0x54


STB -> Card。读取智能卡卡号。



0x00 0x00 0x07

0x00 0x00 0x01 0x33 0x11 0x90 0x00 0xb7


Card -> STB。回复卡号信息。其中0x00 0x01 0x33 0x11换算成十进制78609是卡号。



0x00 0x00 0x05

0x81 0xd0 0x00 0x01 0x08 0x5d


STB -> Card。读取智能卡解析CW的密钥。



0x00 0x00 0x0a

0x24 0x3b 0x45 0xd8 0xab 0xf5 0x09 0xa6 0x90
0x00
0xe9


Card -> STB。回复解析CW的密钥。其中0x24 0x3b 0x45 0xd8 0xab 0xf5 0x09 0xa6是解析CW的密钥。



0x00
0x00
0x49

0x80
0xea 0x80*0x00 0x16 0x00 0x00 0x3f
0x90
0x03 0x00 0x00 0x1c 0x85 0xa2 0x85
0x8b 0x1e 0x88 0x43 0x22 0x8b 0xc9 0x6a
0xc4 0x50 0x5c 0xf4 0x1c 0xfc 0xb8 0xc6
0x63 0xe2 0x2b 0x95 0xe9 0xe8 0x8e 0xe2
0x17 0xcf 0x93 0x07 0xa9 0xdc 0x28 0x52
0x2e 0xca 0x21 0xc1 0x3c 0xaf 0x76 0x78
0x82 0x50 0x24 0x97 0xfe 0x81 0xdb 0x2a
0x28 0xb1 0x0b 0xbd 0xd1 0x2a 0x13 0x01 0x00
0xf0


STB -> Card。ECM。共77字节。



0x00
0x00
0x13

0x72 0x7f 0xca 0xfa 0xce 0x53 0x21 0xd2 0xb8 0x4f 0xaa 0x9b 0x3f 0xa8 0xc5 0xbc 0xe7
0x90
0x00
0x1f


Card -> STB。CW。其中0x7f 0xca 0xfa 0xce 0x53 0x21 0xd2 0xb8 0x4f 0xaa 0x9b 0x3f 0xa8 0xc5 0xbc 0xe7是CW的关键信息。这里还需要大家要着重注意的一点是:这16个字节是直接从智能卡里读出来的,但并不是直接用来解节目的。这16个字节,分为两部分,前8个字节和后8个字节,这两部分的8个字节分别与CW的密钥的8个字节异或之后才是真正用来解节目的信息。这是BJST与YXTF、SMSX不同的地方。具体程序为

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


tempcw=response[i+1]^difor[i%8];

response[16] 是指0x72 0x7f 0xca 0xfa 0xce 0x53 0x21 0xd2 0xb8 0x4f 0xaa 0x9b 0x3f 0xa8 0xc5 0xbc 0xe7,difor[8]是密钥0x24 0x3b 0x45 0xd8 0xab 0xf5 0x09 0xa6,tempcw[16]是真正用来解节目的信息。




程序设计者在设计程序时,无论是机顶盒还是智能卡无线小板上的单片机智能卡接口接收数据,都要设计成首先接收前三个字节,根据第三个字节再决定后面还有接收多少字节。


七、 破解机卡配对
所谓的机卡配对是指特定的某一张智能卡配上与之配对的一台机顶盒才能解节目。有部分YXTF智能卡使用了这项技术,为GX带来了麻烦。其实,只要知道了机卡配对的原理,要破解它也很容易。

在初始化YXTF智能卡时,如果命令0x80 0x4c 0x00 0x00 0x040 xff 0xff 0xff 0xff后智能卡的回复是0x94 0xb2,说明这张智能卡是需要机卡配对的。如果没有给卡发送配对命令0x80 0x4c 0x00 0x00 0x04 0x5e 0xe4 0x82 0xf2,或者配对信息0x5e 0xe4 0x82 0xf2不对(每张卡的配对信息都不一样),机顶盒在解需要机卡配对的节目时,解节目就会失败。所以破解机卡配对的关键就在于给卡发送一个正确的机卡配对信息。在无线GX网络中,作为子机的原装机顶盒有机卡配对信息,但是母机没有,这就需要母机事先“学习”子机的配对信息,下次母机开机是就不用再获取子机的配对信息了。所谓母机的“学习”智能卡配对信息,就是在母机程序中加上一个功能:当子机将配对信息发给母机时,母机识别出此命令是配对命令(开命令的开头是否是0x80 0x4c 0x00 0x00 0x04),母机就把0x80 0x4c 0x00 0x00 0x04后的四个字节写到自己的FLASH中的一个文件yxtfkey.txt。等到下次开机时,母机从yxtfkey.txt读出配对信息的四个字节去跟对应的智能卡配对。如果配对成功,智能卡就认为母机是与之配对的机顶盒,当收到需要机卡配对节目的ECM时,就会非常“顺从”将正确的CW送出。所以,对于存在机卡配对的情况,只需对插卡的那台机器(母机)做机卡配对。插卡的机器完成配对后,其所带的所有无线网络、局域网或广域网的分机都不需要再做这个对应工作。如果母机没有配对成功,母机需要下一次“学习”。

八、 关键技术
在无线GX系统中,比较关键的技术有以下几点:

第一,
智能卡无线小板单片机定时器的时间设定。不同的机顶盒,智能卡的时钟频率是不一样的,所以智能卡通信的波特率也不一样。具体频率是多少需要用示-波-器测量,然后计算出智能卡通信每位所占用的时间,从而进一步设定定时器的时间。如果机顶盒与智能卡还是不能顺利的通信,需要用示-波-器对比读真卡时数据的波形,调整定时器时间,让智能卡无线小板DATA脚的波形模仿真卡的波形。根据调试的经验,一般情况,只要智能卡发送数据能被机顶盒正确接收,智能卡接收数据就没有问题。

第二,
缩短使用T0通信协议智能卡的子机ECM和CW之间的时间间隔。机顶盒每次换台时,如果换的新节目是加扰的,要向智能卡发送新的ECM。如果ECM和CW之间的时间间隔太长,换台的时间间隔也很长,影响收看节目的质量。

以 YXTF无线GX为例,母机从发送ECM到CW的过程是:机顶盒发送ECM->智能卡解析ECM->智能卡回复0x61 0x2b->机顶盒发送0x00 0xc0 0x00 0x00 0x2b->智能卡回复CW。子机的这个过程可以是:机顶盒发送ECM->仿真智能卡回复0x61 0x2b->机顶盒发送0x00 0xc0 0x00 0x00 0x2b->无线发送ECM->母机解析出CW并将CW无线发给子机->仿真智能卡回复CW。但是“无线发送ECM”和“母机解析出 CW并将CW无线发给子机”包含无线传输和母机与真正智能卡对话这两个过程,需要消耗约0.5s的时间,换台时间比较长。我们可以统筹一下,一旦得到 ECM后就立刻无线发给母机,所以可以是:机顶盒发送ECM->仿真智能卡回复0x61 0x2b->无线发送ECM ->机顶盒发送0x00 0xc0 0x00 0x00 0x2b ->母机解析出CW并将CW无线发给子机->仿真智能卡回复CW。但是根据调试经验,这样也有一个问题,无线发送ECM是一个连续的过程,大约需要消耗67ms,而机顶盒在收到0x61 0x2b后约50ms后就发出0x00 0xc0 0x00 0x00 0x2b。价格低廉的8位51核的单片机程序运行是实时单任务,也就是说单片机由于无线发送ECM而错过了接收0x00 0xc0 0x00 0x00 0x2b,当然也就没有回复过程字节0xc0,“聪明”一些的机顶盒会在3s之后重新发送0x00 0xc0 0x00 0x00 0x2b,这时单片机才会把过程字节0xc0和CW回复给机顶盒,这样的话换台时间将会变成恐怖的3s以上。没有重发功能的机顶盒就认为没有接收到CW,导致解节目失败。所以我们要相办法延迟机顶盒发送0x00 0xc0 0x00 0x00 0x2b,为此,我们可以按照以下流程设计:

总之一个原则是尽早把ECM发给母机,让母机处理ECM与子机机顶盒和仿真智能卡的对话过程同时进行,等接收到了正确的CW,并且收到了子机发送的命令0x00 0xc0 0x00 0x00 0x2b ,立刻将CW发给子机。

第三,对于T0协议的智能卡,因为子机从发送ECM到得到CW包含了母机访问真正智能卡的过程,所以缩短母机访问真正智能卡这个过程的时间才是缩短子机换台时间的根本。母机访问真正智能卡时间的长短可以通过调整母机机顶盒的程序来调整

0
回复
dulai1985
LV.10
26
2013-10-24 15:51
@dulai1985
下面开始学习用库函数来学习串口通讯协议从STM32手册上看到了智能卡协议:智能卡通信协议破解智能卡的基础知识(转) 智能卡无线小板相对于串口无线小板最大的不同是智能卡无线小板上的单片机要模仿真正的智能卡来发送和接收机顶盒的数据,这部分功能将直接决定整个无线GX系统的稳定性。智能卡常用的通信协议有T0、T1和T14协议,关于这三种通信协议完整的介绍,在很多资料上都能找到,本文不再详细阐述,有兴趣的朋友可以查阅相关书籍。本章节主要介绍BJST、YXTF、SMSX这三种智能卡的通信协议的关键技术和机顶盒智能卡命令、应答具体格式以及详细说明。首先介绍一下ATR(AnswerToReset,复位应答)。当加上供电电压、时钟和复位信号后,智能卡经DATA线送出其复位应答ATR。这个数据串最多含有33字节,总是按分频值(时钟频率转换因子)为372传送的,这是遵照ISO/IEC7816-3标准的规定。它含有关于传输协议和卡的各种数据,即使在ATR之后的传输协议使用的是不同的分频值(例如:512),也应当用372这个分频值来发送ATR。这就保证了从任何卡总能接收到一个ATR,而不管传输协议的参数是怎样的。需要大家注意的是,这里强调的是发送ATR的分频值总是372,但是并没有说发送ATR的波特率是固定的,波特率还要看机顶盒的智能卡槽的时钟频率是多少,ATR的波特率=机顶盒所加时钟频率/372。常用的机顶盒的智能卡槽的时钟频率有4.515MHz、4.9152MHz和3.5712MHz。YXTF、SMSX智能卡用到的是标准的T0协议。BJST所使用的协议类似于T1协议,单不是标准的T1协议,是一种介于T0协议和T1协议之间的协议,我们暂时称之为TN协议。根据调试的经验,这三种智能卡都有一个规律:发送ATR的波特率和ATR之后的机顶盒命令、智能卡应答的波特率相同。下面我们来看YXTF智能卡命令和应答(按时间先后顺序)。STB:机顶盒。Card:智能卡。STB->Card:机顶盒发送给智能卡。Card->STB:智能卡发送给机顶盒。智能卡命令或应答传输方向,命令或应答的详细说明0x3b0x6c0x000x000x4e0x540x490x430x300x910x690x000x4a0x030x000x00Card->STB。YXTF的ATR。0x000xa40x040x000x050xf90x5a0x540x000x06STB->Card。初始命令。0x900x00Card->STB。表示智能卡收到了正确的初始命令0x800x460x000x000x040x010x000x000x04STB->Card。获取智能卡号码命令。0x610x04Card->STB。告知机顶盒号码占用0x04个字节。0x000xc00x000x000x04STB->Card。读取智能卡号码。0xaa0xbb0xcc0xdd0x900x00Card->STB。告知机顶盒智能卡号码,并以0x900x00结尾告知机顶盒获取智能卡号码的命令被完整而成功地执行。0x800x460x000x000x040x030x000x000x09STB->Card。获取智能卡年龄等级命令。0x610x09Card->STB。告知机顶盒年龄等级信息占用0x09个字节0x000xc00x000x000x09STB->Card。读取智能卡年龄等级信息。0x300x000x000x000x000x000x000x000x000x900x00Card->STB。告知机顶盒智能卡年龄等级信息,并以0x900x00结尾告知机顶盒获取智能卡年龄等级的命令被完整而成功地执行。0x800x440x000x000x08STB->Card。读取智能卡运营商信息。0x170x170x000x000x000x0a0x000x000x900x00Card->STB。告知机顶盒运营商信息,例如0x1717十进制为5911,表示第一个运营商是电话区号为0591的第一个城市。并以0x900x00结尾告知机顶盒获取智能卡年龄等级的命令被完整而成功地执行。0x800x4c0x000x000x040xff0xff0xff0xffSTB->Card。检查智能卡是否需要机卡配对。0x940xb2Card->STB。如果为0x940xb2,说明此卡需要机卡配对。如果为0x940xb1,说明此卡不需要机卡配对。0x800x4c0x000x000x040x5e0xe40x820xf2STB->Card。给卡发送四个配对字节:0x5e0xe40x820xf2,看是否能配对成功0x900x00Card->STB。如果为0x900x00,说明四个配对字节与此卡配对成功。如果回复其他数据,说明配对失败。0x800x460x170x170x040x040x000x000x48STB->Card。获取运营商一产品包列表。其中0x170x17是运营商一的号码。0x610x48Card->STB。告知机顶盒运营商一产品包列表占用0x48个字节0x000xc00x000x000x48STB->Card。读取运营商一产品包列表。0x00…..0x00(共0x48个)0x900x00Card->STB。返回运营商一产品包列表。并以0x900x00结尾告知机顶盒获取运营商一产品包列表的命令被完整而成功地执行。0x800x480x170x170x040x810x000x000x3eSTB->Card。获取运营商一授权信息。其中0x170x17是运营商一的号码。0x610x27Card->STB。告知机顶盒运营商一授权信息占用0x27个字节0x000xc00x000x000x27STB->Card。读取运营商一授权信息。0x000x000x090x000x000x000x000x000x000x000x010x000x000x010x000x000x000x800x000x000x010xff0xfe0x000x000x000x020x000x010x000x010x000x010x000x020x000x010x000x040x900x00Card->STB。返回机顶盒运营商一授权信息。其中前三个字节0x000x000x09表示授权信息共有0x09条,以后每四个字节作为一条授权信息。例如0x000x010xff0xfe表示ID号为65534(0xfffe)的节目,第二个字节0x01表示在界面上显示此节目ID,第二个字节为0x00表示不显示。0x800x460x000x0a0x040x040x000x000x48STB->Card。获取运营商二产品包列表。其中0x000x0a是运营商二的号码。0x610x48Card->STB。告知机顶盒运营商二产品包列表占用0x48个字节0x000xc00x000x000x48STB->Card。读取运营商二产品包列表。0x00…..0x00(共0x48个)0x900x00Card->STB。返回运营商二产品包列表。并以0x900x00结尾告知机顶盒获取运营商二产品包列表的命令被完整而成功地执行。0x800x480x000x0a0x040x810x000x000x3eSTB->Card。获取运营商二授权信息。其中0x000x0a是运营商二的号码。0x610x0bCard->STB。告知机顶盒运营商二授权信息占用0x0b个字节0x000xc00x000x000x0bSTB->Card。读取运营商二授权信息。0x000x000x020x000x000x000x000x000x000x000x010x900x00Card->STB。返回机顶盒运营商一授权信息。其中前三个字节0x000x000x02表示授权信息共有0x02条。分析方法同上面运营商一授权信息的分析方法。上面是一个智能卡初始化比较全面的例子。一般的机顶盒不会有这么多初始化命令。需要说明以下几点:第一,T0协议的长度字节在第五个字节,长度字节加上5是整个命令的长度。第二,按照T0协议,机顶盒首先发送命令的前五个字节,等收到了PB(过程字节)之后,再发送后面的字节。不足五个字节的命令一次发完。以读取卡号的命令为例,第一步机顶盒先发送0x800x460x000x000x04;第二步智能卡选取第二个字节0x46作为过程字节回复机顶盒;第三步机顶盒再发送后面四个字节0x010x000x000x04;第四步智能卡回复0x610x04表示收到了机顶盒命令并成功执行,返回0x04表示卡号信息是四个字节;第五步机顶盒发送0x000xc00x000x000x04来读取卡号;第六步智能卡选取第二个字节0x0c作为过程字节回复机顶盒;第七步智能卡发送卡号信息0xaa0xbb0xcc0xdd  0x900x00,以0x900x00结尾表示收到了机顶盒命令并成功执行。第三,智能卡接收到五个字节回复第二个字节作为过程字节,然后如何判断这个命令是否已经结束呢?方法是看开头是否是0x000xc0开头,如果是,此命令就是长度就是5,智能卡已经收到了完整的数据了。比如读取卡号命令0x000xc00x000x000x04,智能卡需要回复0x04个字节的卡号信息;如果不是0x000xc0开头,比如0x800x460x000x000x04,说明这个命令还有0x04要发。当然也有一个例外,获取运营商命令0x800x440x000x000x08,只有五个字节。我们在单片机程序设计中采用了这种方法。第四,机卡配对技术将作为单独的一章在后文中做详细介绍。机顶盒对智能卡完成这些初始化的“问题”后,就开始发送ECM。0x800x3a0x170x170x530xd60x2f0xc00x440x0f0x370x940x7d0x020xba0xe00x6e0xa30x630x170x300xb30x8e0x820x5b0x810x9d0xd90x950x4d0xb00xd70x0d0x9f0x510xb60x570x020x090x000x010x000x010xd10x8f0xaa0x310xbe0x440xae0x400x8b0x2b0x450x120xda0xce0x500x330x090x000x010x000x030x1f0xc90xf90xbb0x800x9a0x100x880x110xd40x5d0x670xf90x3f0x300x120x470x5b0xfb0x510x650x200x340x51STB->Card。ECM,共88字节。0x170x17是运营商号。0x610x2bCard->STB。告知机顶盒运CW共0x2b个字节,让机顶盒来读取。0x000xc00x000x000x2bSTB->Card。机顶盒读取CW命令。0x0a0x170x170x440x0f0x370x940x7d0xab0xec0xe10x780x140x580xae0x1a0x4f0xec0x8d0xc80x500x3c0xbb0x470x000x0c0x5e0x000x010x000x000x000x000x000x000x000x000x000x000x000x000x000x00Card->STB。CW。0xab0xec0xe10x780x140x580xae0x1a0x4f0xec0x8d0xc80x500x3c0xbb0x47是用来解节目的有效数据。如果用户访问运营商授权信息页面,还有有以下的命令和回复。智能卡命令或应答传输方向,命令或应答的详细说明0x800x460x000x0a0x040x020x000x000x16STB->Card。获取运营商二信息的命令。0x610x16Card->STB。0x000xc00x000x000x16STB->Card。读取运营商二信息的命令。0x000x0a0x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x900x00Card->STB。告知机顶盒运营商二信息。0x800x460x170x170x040x020x000x000x16STB->Card。获取运营商一信息的命令。0x610x16Card->STB。0x000xc00x000x000x16STB->Card。读取运营商一信息的命令。0x170x170x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x900x00Card->STB。告知机顶盒运营商一信息。0x800x480x000x0a0x040x010x000x000x13STB->Card。获取运营商二授权信息。0x610x1dCard->STB。0x000xc00x000x000x1dSTB->Card。读取运营商二授权信息。0x000x000x020x000x000x000x000x000x0c0xd90x000x000x360x380xbf0x7d0x000x000x000x010x000x0b0xe70x510xa60x360x380xbf0x7d0x900x00Card->STB。告知机顶盒运营商二授权信息。其中前三个字节0x000x000x02表示授权信息共有0x02条,以后每13个字节作为一条授权信息。具体解释同下面运营商一授权信息的解释。0x800x480x000x0a0x040x020x000x000x14STB->Card。获取运营商二未知信息。0x610x03Card->STB。0x000xc00x000x000x03STB->Card。读取运营商二未知信息。0x000x000x000x900x00Card->STB。告知机顶盒运营商二未知信息。0x800x480x170x170x040x010x000x000x13STB->Card。获取运营商一授权信息。0x610x78Card->STB。0x000x000x090x000x000x000x000x000x0c0xd90x000x000x360x380xbf0x7d0x000x000x000x010x000x0b0xe70x510xa60x360x380xbf0x7d0x000x000x010x000x000x0e0xdf0x730x820x1d0xf70xbf0x7d0x000x000x800x000x000x0e0xdf0x730x820x1d0xf70xbf0x7d0x000x010xff0xfe0x000x0e0xdf0x730x820x1d0xf70xbf0x7d0x000x000x000x020x000x0e0xdf0x730x820x1d0xf70xbf0x7d0x000x010x000x010x000x0e0x490x730x820x1d0xf70xbf0x7d0x000x010x000x020x000x0e0x490x730x820x0f0xb50xbf0x7d0x000x010x000x040x010x0e0x3d0x690x660x0f0x4b0x810xa50x900x00Card->STB。告知机顶盒运营商一授权信息。其中前三个字节0x000x000x09表示授权信息共有0x09条,以后每13个字节作为一条授权信息。例如0x000x010xff0xfe0x000x0e0xdf0x730x820x1d0xf70xbf0x7d表示ID为65534(0xfffe)的节目授权开始时间为0x0e0xdf0x730x82,结束时间为0x1d0xf70xbf0x7d,要在界面上显示出来,没有购买录像。第二个字节,0x01表示要在机顶盒运营商授权信息页面上显示,0x00表示不显示。第五个字节,0x00表示此节目没有购买录像,0x01表示此节目购买了录像。0x800x480x170x170x040x020x000x000x14STB->Card。获取运营商一未知信息。0x610x03Card->STB。0x000xc00x000x000x03STB->Card。读取运营商一未知信息。0x000x000x000x900x00Card->STB。告知机顶盒运营商一未知信息。下面我们来看SMSX智能卡命令和应答。SMSX与YXTF应答和命令比较相似。0x3b0x020x170x72Card->STB。SMSX的ATR。0x000xa40x040x000x020x3f0x00STB->Card。初始命令一。0x900x00Card->STB。表示智能卡收到了正确的初始命令一0x000xa40x040x000x020x4a0x00STB->Card。初始命令二。0x900x00Card->STB。表示智能卡收到了正确的初始命令二0x000xb20x000x050x060x000x010xff0x000x010xffSTB->Card。获取智能卡号码命令。0x610x67Card->STB。告知机顶盒号码信息占用0x67个字节。0x000xc00x000x000x67STB->Card。读取智能卡号码命令。0x000x010x64*0x040x110x220x33*0x830x500x110x060x820x310x730x13*0x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000xca0xfd0xc20xeb0xca0xd30xd10xb60x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x330x000x000x020x0b0x5c0x4b0xa70x090x900x00Card->STB。告知机顶盒智能卡号码,并以0x900x00结尾告知机顶盒获取智能卡号码的命令被完整而成功地执行。其中8350110682317313表示完整的智能卡卡号,也就是智能卡背面的条形码号码。0x040x110x220x33换算成相应的十进制68231731表示卡号从倒数第二位到倒数第九位的部分。0x800x320x000x000x440x810x300x410x000x040xce0x660xa30x4c0x7b0x890x700x500xd40x6b0xae0x0c0xb80xd80x530x2e0x740x120x030x5b0xcd0xc70x660xf60x8f0x0c0x960xa00xa00xee0x610xff0x120xb20xa90xea0xb30x160xef0x5e0xc80xf30x880xff0x770x040x4d0xf90x160xe00xac0x900x970x730x6b0x5e0x240xee0xfd0xc60xbc0xf40x71STB->Card。ECM,共73字节。0x600x610x2aCard->STB。告知机顶盒运CW共0x2a个字节,让机顶盒来读取。0x000xc00x000x000x2aSTB->Card。机顶盒读取CW命令。0x040xce0x840x030x000x010x000x840x030x000x030xb00xb40x040x000x000x000x000x830x160xd60x310x030x80*0xd00x8b0x020x5d*0x00*0x420x290x860xf10x820x1c0xfc0x9a*0x00*0x3e0x800x7c0x3a0x900x00Card->STB。CW。其中0xd00x8b0x020x5d,0x420x290x860xf10x820x1c0xfc0x9a,0x3e0x800x7c0x3a是解加扰节目的关键数据。BJST所使用的TN协议是一种介于T0和T1之间的协议,长度在第三个字节。这种协议不像T0协议那样需要多次发送命令多次回复才能得到一条信息,TN协议只需要一问一答就能获得一条信息。下面我们来看BJST智能卡命令和应答。0x3b0xe90x000x000x810x310xc30x450x990x630x740x690x190x990x120x560x100xecCard->STB。BJST的ATR。18字节。0x000x000x050x000x840x000x000x100x91STB->Card。初始命令一。第三个字节0x05加上4是整个命令的长度,最后一个字节0x91是前面所有字节异或后得到的校验字节。0x000x000x120xe40x740x270xee0xd20x9d0xb00x250x5e0xa60x980x970xd60xbe0x100xbe0x900x000x30Card->STB。回复初始命令一。第三个字节0x12加上4是整个命令的长度。0x000x000x0e0x000x0c0x000x000x100xe40x740x270xee0xd20x9d0xb00x250x560xc7STB->Card。初始命令二。0x000x000x0a0xf10x3d0x020x840xcf0x510x0e0xe10x900x000xa1Card->STB。回复初始命令二。0x000x000x0e0x000x0b0x000x000x100xf10x3d0x020x840xcf0x510x0e0xe10x560x78STB->Card。初始命令三。0x000x000x020x900x000x92Card->STB。回复初始命令三。0x000x000x050x810xd40x000x010x050x54STB->Card。读取智能卡卡号。0x000x000x070x000x000x010x330x110x900x000xb7Card->STB。回复卡号信息。其中0x000x010x330x11换算成十进制78609是卡号。0x000x000x050x810xd00x000x010x080x5dSTB->Card。读取智能卡解析CW的密钥。0x000x000x0a0x240x3b0x450xd80xab0xf50x090xa60x900x000xe9Card->STB。回复解析CW的密钥。其中0x240x3b0x450xd80xab0xf50x090xa6是解析CW的密钥。0x000x000x490x800xea0x80*0x000x160x000x000x3f0x900x030x000x000x1c0x850xa20x850x8b0x1e0x880x430x220x8b0xc90x6a0xc40x500x5c0xf40x1c0xfc0xb80xc60x630xe20x2b0x950xe90xe80x8e0xe20x170xcf0x930x070xa90xdc0x280x520x2e0xca0x210xc10x3c0xaf0x760x780x820x500x240x970xfe0x810xdb0x2a0x280xb10x0b0xbd0xd10x2a0x130x010x000xf0STB->Card。ECM。共77字节。0x000x000x130x720x7f0xca0xfa0xce0x530x210xd20xb80x4f0xaa0x9b0x3f0xa80xc50xbc0xe70x900x000x1fCard->STB。CW。其中0x7f0xca0xfa0xce0x530x210xd20xb80x4f0xaa0x9b0x3f0xa80xc50xbc0xe7是CW的关键信息。这里还需要大家要着重注意的一点是:这16个字节是直接从智能卡里读出来的,但并不是直接用来解节目的。这16个字节,分为两部分,前8个字节和后8个字节,这两部分的8个字节分别与CW的密钥的8个字节异或之后才是真正用来解节目的信息。这是BJST与YXTF、SMSX不同的地方。具体程序为for(i=0;i智能卡解析ECM->智能卡回复0x610x2b->机顶盒发送0x000xc00x000x000x2b->智能卡回复CW。子机的这个过程可以是:机顶盒发送ECM->仿真智能卡回复0x610x2b->机顶盒发送0x000xc00x000x000x2b->无线发送ECM->母机解析出CW并将CW无线发给子机->仿真智能卡回复CW。但是“无线发送ECM”和“母机解析出CW并将CW无线发给子机”包含无线传输和母机与真正智能卡对话这两个过程,需要消耗约0.5s的时间,换台时间比较长。我们可以统筹一下,一旦得到ECM后就立刻无线发给母机,所以可以是:机顶盒发送ECM->仿真智能卡回复0x610x2b->无线发送ECM->机顶盒发送0x000xc00x000x000x2b->母机解析出CW并将CW无线发给子机->仿真智能卡回复CW。但是根据调试经验,这样也有一个问题,无线发送ECM是一个连续的过程,大约需要消耗67ms,而机顶盒在收到0x610x2b后约50ms后就发出0x000xc00x000x000x2b。价格低廉的8位51核的单片机程序运行是实时单任务,也就是说单片机由于无线发送ECM而错过了接收0x000xc00x000x000x2b,当然也就没有回复过程字节0xc0,“聪明”一些的机顶盒会在3s之后重新发送0x000xc00x000x000x2b,这时单片机才会把过程字节0xc0和CW回复给机顶盒,这样的话换台时间将会变成恐怖的3s以上。没有重发功能的机顶盒就认为没有接收到CW,导致解节目失败。所以我们要相办法延迟机顶盒发送0x000xc00x000x000x2b,为此,我们可以按照以下流程设计:总之一个原则是尽早把ECM发给母机,让母机处理ECM与子机机顶盒和仿真智能卡的对话过程同时进行,等接收到了正确的CW,并且收到了子机发送的命令0x000xc00x000x000x2b,立刻将CW发给子机。第三,对于T0协议的智能卡,因为子机从发送ECM到得到CW包含了母机访问真正智能卡的过程,所以缩短母机访问真正智能卡这个过程的时间才是缩短子机换台时间的根本。母机访问真正智能卡时间的长短可以通过调整母机机顶盒的程序来调整
NRZ-1编码
NRZ-I No Return Zero-Inverse   非归零反相编码
在NRZ-I编码方式中,信号电平的一次反转代表比特1。
就是说是从正电平到负电平的一次跃迁,而不是电压值本身,来代表一个比特1。
0比特由没有电平变化的信号代表。
非归零反相编码相对非归零电平编码的优点在于:因为每次遇到比特1都发生电平跃迁,这能提供一种同步机制。
一串7个比特1会导致7次电平跃迁。
每次跃迁都使接收方能根据信号的实际到达来对本身时钟进行重同步调整。
根据统计,连续的比特1出现的几率比连续的比特0出现的几率大,因此对比特 1的连续串进行同步就在保持整体消息同步上前进了一大步。
一串连续的比特0仍会造成麻烦,但由于连续0串出现不频繁,对于解码来说其妨碍就小了许多。
0
回复
dulai1985
LV.10
27
2013-11-08 13:30
@dulai1985
NRZ-1编码NRZ-INoReturnZero-Inverse  非归零反相编码在NRZ-I编码方式中,信号电平的一次反转代表比特1。就是说是从正电平到负电平的一次跃迁,而不是电压值本身,来代表一个比特1。0比特由没有电平变化的信号代表。非归零反相编码相对非归零电平编码的优点在于:因为每次遇到比特1都发生电平跃迁,这能提供一种同步机制。一串7个比特1会导致7次电平跃迁。每次跃迁都使接收方能根据信号的实际到达来对本身时钟进行重同步调整。根据统计,连续的比特1出现的几率比连续的比特0出现的几率大,因此对比特1的连续串进行同步就在保持整体消息同步上前进了一大步。一串连续的比特0仍会造成麻烦,但由于连续0串出现不频繁,对于解码来说其妨碍就小了许多。
0
回复
dulai1985
LV.10
28
2013-11-08 13:33
@dulai1985
什么是USB-OTG??
http://wenku.baidu.com/view/cc8a98ea5ef7ba0d4a733b1b.html
0
回复
dulai1985
LV.10
29
2013-11-08 13:37
@dulai1985
http://wenku.baidu.com/view/cc8a98ea5ef7ba0d4a733b1b.html
0
回复
zeer
LV.2
30
2013-12-22 20:29
请问有没有好板子+资料推荐的,我想转到ARM学习
0
回复