久久久国产精品视频袁燕,99re久久精品国产,亚洲欧美日韩国产综合v,天天躁夜夜躁狠狠久久,激情五月婷婷激情五月婷婷

  • 回復
  • 收藏
  • 點贊
  • 分享
  • 發(fā)新帖

STM32的學習總結~~

先占個位置,后續(xù)邊學習邊更新~~

把自己所學的,所理解的東西發(fā)出來~~

全部回復(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 倒數(shù)到 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后綴,系統(tǒng)默認為:int, 即,有符號整數(shù)。



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 數(shù),這個數(shù)的大小是 
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里面會發(fā)生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里面會發(fā)生100次時鐘中斷,也就是10ms來一次中斷,則最小的延時單位就是10ms。在LM3S平臺下移植ucos,用systick來做時間管理的時鐘源的話,初始化的時候是這樣寫的:SysTickPeriodSet((INT32U)(SysCtlClockGet()/OS_TICKS_PER_SEC));
STM32 BIT_BAND 位帶別名區(qū)使用入門 
  支持了位帶操作(bit_band),有兩個區(qū)中實現(xiàn)了位帶。其中一個是SRAM 區(qū)的最低1MB 范圍,第二個則是片內外設  //  區(qū)的最低1MB 范圍。這兩個區(qū)中的地址除了可以像普通的RAM 一樣使用外,它們還都有自  
//  己的“位帶別名區(qū)”,位帶別名區(qū)把每個比特膨脹成一個32 位的字  //  
//  每個比特膨脹成一個32 位的字,就是把  1M  擴展為 32M ,  //  
//  于是;RAM地址 0X200000000(一個字節(jié))擴展到8個32 位的字,它們是:  //   0X220000000 ,0X220000004,0X220000008,
0X22000000C,0X220000010,0X220000014, 0X220000018,0X22000001C  // 支持位帶操作的兩個內存區(qū)的范圍是:  // 0x2000_0000‐0x200F_FFFF(SRAM 區(qū)中的  
// 0x4000_0000‐0x400F_FFFF(片上外設區(qū)中的最低1MB)  /*    
對SRAM 位帶區(qū)的某個比特,記它所在字節(jié)地址為A,位序號  在別名區(qū)的地址為:  
AliasAddr= 0x22000000 +((A‐0x20000000)*8+n)*4 =0x22000000+ (A‐0x20000000)*32 + n*4  
對于片上外設位帶區(qū)的某個比特,記它所在字節(jié)的地址為A,位序號為n(0<=n<=7),則該比特  在別名區(qū)的地址為:  
AliasAddr= 0x42000000+((A‐0x40000000)*8+n)*4 =0x42000000+ (A‐0x40000000)*32 + n*4  
上式中,“*4”表示一個字為4 個字節(jié),“*8”表示一個字節(jié)中有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 位帶別名區(qū)使用入門 
  支持了位帶操作(bit_band),有兩個區(qū)中實現(xiàn)了位帶。其中一個是SRAM 區(qū)的最低1MB 范圍,第二個則是片內外設  //  區(qū)的最低1MB 范圍。這兩個區(qū)中的地址除了可以像普通的RAM 一樣使用外,它們還都有自  
//  己的“位帶別名區(qū)”,位帶別名區(qū)把每個比特膨脹成一個32 位的字  //  
//  每個比特膨脹成一個32 位的字,就是把  1M  擴展為 32M ,  //  
//  于是;RAM地址 0X200000000(一個字節(jié))擴展到8個32 位的字,它們是:  //   0X220000000 ,0X220000004,0X220000008,
0X22000000C,0X220000010,0X220000014, 0X220000018,0X22000001C  // 支持位帶操作的兩個內存區(qū)的范圍是:  // 0x2000_0000‐0x200F_FFFF(SRAM 區(qū)中的  
// 0x4000_0000‐0x400F_FFFF(片上外設區(qū)中的最低1MB)  /*    
對SRAM 位帶區(qū)的某個比特,記它所在字節(jié)地址為A,位序號  在別名區(qū)的地址為:  
AliasAddr= 0x22000000 +((A‐0x20000000)*8+n)*4 =0x22000000+ (A‐0x20000000)*32 + n*4  
對于片上外設位帶區(qū)的某個比特,記它所在字節(jié)的地址為A,位序號為n(0<=n<=7),則該比特  在別名區(qū)的地址為:  
AliasAddr= 0x42000000+((A‐0x40000000)*8+n)*4 =0x42000000+ (A‐0x40000000)*32 + n*4  
上式中,“*4”表示一個字為4 個字節(jié),“*8”表示一個字節(jié)中有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位帶別名區(qū)使用入門  支持了位帶操作(bit_band),有兩個區(qū)中實現(xiàn)了位帶。其中一個是SRAM區(qū)的最低1MB范圍,第二個則是片內外設 // 區(qū)的最低1MB范圍。這兩個區(qū)中的地址除了可以像普通的RAM一樣使用外,它們還都有自 // 己的“位帶別名區(qū)”,位帶別名區(qū)把每個比特膨脹成一個32位的字 // // 每個比特膨脹成一個32位的字,就是把 1M 擴展為32M, // // 于是;RAM地址0X200000000(一個字節(jié))擴展到8個32位的字,它們是: // 0X220000000,0X220000004,0X220000008,0X22000000C,0X220000010,0X220000014,0X220000018,0X22000001C //支持位帶操作的兩個內存區(qū)的范圍是: //0x2000_0000‐0x200F_FFFF(SRAM區(qū)中的 //0x4000_0000‐0x400F_FFFF(片上外設區(qū)中的最低1MB) /*  對SRAM位帶區(qū)的某個比特,記它所在字節(jié)地址為A,位序號 在別名區(qū)的地址為: AliasAddr=0x22000000+((A‐0x20000000)*8+n)*4=0x22000000+(A‐0x20000000)*32+n*4 對于片上外設位帶區(qū)的某個比特,記它所在字節(jié)的地址為A,位序號為n(0
AHB  隨著深亞微米工藝技術日益成熟,集成電路芯片的規(guī)模越來越大。數(shù)字IC從基于時序驅動的設計方法,發(fā)展到基于IP復用的設計方法,并在SOC設計中得到了廣泛應用。在基于IP復用的SoC(System on Chip的縮寫,稱為系統(tǒng)級芯片,也有稱片上系統(tǒng))設計中,片上總線設計是最關鍵的問題。為此,業(yè)界出現(xiàn)了很多片上總線標準。其中,由ARM公司推出的AMBA片上總線受到了廣大IP開發(fā)商和SoC系統(tǒng)集成者的青睞,已成為一種流行的工業(yè)標準片上結構。AMBA規(guī)范主要包括了AHB(Advanced High performance Bus)系統(tǒng)總線和APB(Advanced Peripheral Bus)外圍總線。 
  AMBA片上總線
  AMBA 2.0規(guī)范包括四個部分:AHB、ASB、APB和Test Methodology。AHB的相互連接采用了傳統(tǒng)的帶有主模塊和從模塊的共享總線,接口與互連功能分離,這對芯片上模塊之間的互連具有重要意義。AMBA已不僅是一種總線,更是一種帶有接口模塊的互連體系。
  基于AMBA的片上系統(tǒng)
  大多數(shù)掛在總線上的模塊(包括處理器)只是單一屬性的功能模塊:主模塊或者從模塊。主模塊是向從模塊發(fā)出讀寫操作的模塊,如CPU,DSP等;從模塊是接受命令并做出反應的模塊,如片上的RAM,AHB/APB 橋等。另外,還有一些模塊同時具有兩種屬性,例如直接存儲器存取(DMA)在被編程時是從模塊,但在系統(tǒng)讀傳輸數(shù)據(jù)時必須是主模塊。如果總線上存在多個主模塊,就需要仲裁器來決定如何控制各種主模塊對總線的訪問。雖然仲裁規(guī)范是AMBA總線規(guī)范中的一部分,但具體使用的算法由RTL設計工程師決定,其中兩個最常用的算法是固定優(yōu)先級算法和循環(huán)制算法。AHB總線上最多可以有16個主模塊和任意多個從模塊,如果主模塊數(shù)目大于16,則需再加一層結構(具體參閱ARM公司推出的Multi-layer AHB規(guī)范)。APB 橋既是APB總線上唯一的主模塊,也是AHB系統(tǒng)總線上的從模塊。其主要功能是鎖存來自AHB系統(tǒng)總線的地址、數(shù)據(jù)和控制信號,并提供二級譯碼以產生APB外圍設備的選擇信號,從而實現(xiàn)AHB協(xié)議到APB協(xié)議的轉換。 
  AHB簡介
  AHB主要用于高性能模塊(如CPU、DMA和DSP等)之間的連接,作為SoC的片上系統(tǒng)總線,它包括以下一些特性:單個時鐘邊沿操作;非三態(tài)的實現(xiàn)方式;支持突發(fā)傳輸;支持分段傳輸;支持多個主控制器;可配置32位~128位總線寬度;支持字節(jié)、半字節(jié)和字的傳輸。AHB 系統(tǒng)由主模塊、從模塊和基礎結構(Infrastructure)3部分組成,整個AHB總線上的傳輸都由主模塊發(fā)出,由從模塊負責回應?;A結構則由仲裁器(arbiter)、主模塊到從模塊的多路器、從模塊到主模塊的多路器、譯碼器(decoder)、虛擬從模塊(dummy Slave)、虛擬主模塊(dummy Master)所組成。
  APB簡介
  APB主要用于低帶寬的周邊外設之間的連接,例如UART、1284等,它的總線架構不像AHB支持多個主模塊,在APB里面唯一的主模塊就是APB 橋。其特性包括:兩個時鐘周期傳輸;無需等待周期和回應信號;控制邏輯簡單,只有四個控制信號。
  1)系統(tǒng)初始化為IDLE狀態(tài),此時沒有傳輸操作,也沒有選中任何從模塊。
  2)當有傳輸要進行時,PSELx=1,PENABLE=0,系統(tǒng)進入SETUP狀態(tài),并只會在SETUP 狀態(tài)停留一個周期。當PCLK的下一個上升沿時到來時,系統(tǒng)進入ENABLE 狀態(tài)。
  3)系統(tǒng)進入ENABLE狀態(tài)時,維持之前在SETUP 狀態(tài)的PADDR、PSEL、PWRITE不變,并將PENABLE置為1。傳輸也只會在ENABLE狀態(tài)維持一個周期,在經(jīng)過SETUP與ENABLE狀態(tài)之后就已完成。之后如果沒有傳輸要進行,就進入IDLE狀態(tài)等待;如果有連續(xù)的傳輸,則進入SETUP狀態(tài)。
0
回復
dulai1985
LV.10
10
2013-07-25 12:27
@dulai1985
AHB  隨著深亞微米工藝技術日益成熟,集成電路芯片的規(guī)模越來越大。數(shù)字IC從基于時序驅動的設計方法,發(fā)展到基于IP復用的設計方法,并在SOC設計中得到了廣泛應用。在基于IP復用的SoC(SystemonChip的縮寫,稱為系統(tǒng)級芯片,也有稱片上系統(tǒng))設計中,片上總線設計是最關鍵的問題。為此,業(yè)界出現(xiàn)了很多片上總線標準。其中,由ARM公司推出的AMBA片上總線受到了廣大IP開發(fā)商和SoC系統(tǒng)集成者的青睞,已成為一種流行的工業(yè)標準片上結構。AMBA規(guī)范主要包括了AHB(AdvancedHighperformanceBus)系統(tǒng)總線和APB(AdvancedPeripheralBus)外圍總線。   AMBA片上總線  AMBA2.0規(guī)范包括四個部分:AHB、ASB、APB和TestMethodology。AHB的相互連接采用了傳統(tǒng)的帶有主模塊和從模塊的共享總線,接口與互連功能分離,這對芯片上模塊之間的互連具有重要意義。AMBA已不僅是一種總線,更是一種帶有接口模塊的互連體系?! 』贏MBA的片上系統(tǒng)  大多數(shù)掛在總線上的模塊(包括處理器)只是單一屬性的功能模塊:主模塊或者從模塊。主模塊是向從模塊發(fā)出讀寫操作的模塊,如CPU,DSP等;從模塊是接受命令并做出反應的模塊,如片上的RAM,AHB/APB橋等。另外,還有一些模塊同時具有兩種屬性,例如直接存儲器存取(DMA)在被編程時是從模塊,但在系統(tǒng)讀傳輸數(shù)據(jù)時必須是主模塊。如果總線上存在多個主模塊,就需要仲裁器來決定如何控制各種主模塊對總線的訪問。雖然仲裁規(guī)范是AMBA總線規(guī)范中的一部分,但具體使用的算法由RTL設計工程師決定,其中兩個最常用的算法是固定優(yōu)先級算法和循環(huán)制算法。AHB總線上最多可以有16個主模塊和任意多個從模塊,如果主模塊數(shù)目大于16,則需再加一層結構(具體參閱ARM公司推出的Multi-layerAHB規(guī)范)。APB橋既是APB總線上唯一的主模塊,也是AHB系統(tǒng)總線上的從模塊。其主要功能是鎖存來自AHB系統(tǒng)總線的地址、數(shù)據(jù)和控制信號,并提供二級譯碼以產生APB外圍設備的選擇信號,從而實現(xiàn)AHB協(xié)議到APB協(xié)議的轉換。   AHB簡介  AHB主要用于高性能模塊(如CPU、DMA和DSP等)之間的連接,作為SoC的片上系統(tǒng)總線,它包括以下一些特性:單個時鐘邊沿操作;非三態(tài)的實現(xiàn)方式;支持突發(fā)傳輸;支持分段傳輸;支持多個主控制器;可配置32位~128位總線寬度;支持字節(jié)、半字節(jié)和字的傳輸。AHB系統(tǒng)由主模塊、從模塊和基礎結構(Infrastructure)3部分組成,整個AHB總線上的傳輸都由主模塊發(fā)出,由從模塊負責回應?;A結構則由仲裁器(arbiter)、主模塊到從模塊的多路器、從模塊到主模塊的多路器、譯碼器(decoder)、虛擬從模塊(dummySlave)、虛擬主模塊(dummyMaster)所組成?! PB簡介  APB主要用于低帶寬的周邊外設之間的連接,例如UART、1284等,它的總線架構不像AHB支持多個主模塊,在APB里面唯一的主模塊就是APB橋。其特性包括:兩個時鐘周期傳輸;無需等待周期和回應信號;控制邏輯簡單,只有四個控制信號。  1)系統(tǒng)初始化為IDLE狀態(tài),此時沒有傳輸操作,也沒有選中任何從模塊?! ?)當有傳輸要進行時,PSELx=1,PENABLE=0,系統(tǒng)進入SETUP狀態(tài),并只會在SETUP狀態(tài)停留一個周期。當PCLK的下一個上升沿時到來時,系統(tǒng)進入ENABLE狀態(tài)?! ?)系統(tǒng)進入ENABLE狀態(tài)時,維持之前在SETUP狀態(tài)的PADDR、PSEL、PWRITE不變,并將PENABLE置為1。傳輸也只會在ENABLE狀態(tài)維持一個周期,在經(jīng)過SETUP與ENABLE狀態(tài)之后就已完成。之后如果沒有傳輸要進行,就進入IDLE狀態(tài)等待;如果有連續(xù)的傳輸,則進入SETUP狀態(tài)。
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
師長啊,有點小亂啊……

說了這是學習筆記

自己不懂的地方才發(fā)出來的哈哈~~~

0
回復
dulai1985
LV.10
15
2013-07-31 13:21
@dulai1985
說了這是學習筆記自己不懂的地方才發(fā)出來的哈哈~~~
#if(C# 參考) 
如果 C# 編譯器遇到最后面跟有 #endif 指令的 #if 指令,則僅當指定的符號已定義時,它才會編譯這兩個指令之間的代碼。 與 C 和 C++ 不同,您不能對符號賦予數(shù)值;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 指令,可以根據(jù)一個或多個符號是否存在來包含或排除代碼。 在編譯調試版本的代碼或針對特定配置進行編譯時,這會很有用。  以 #if 指令開始的條件指令必須用 #endif 指令顯式終止。  
#define 使您可以定義一個符號,通過將該符號用作傳遞給 #if 指令的表達式,使該表達式計算為 true。  
也可以用 /define 編譯器選項來定義符號。 可以用 #undef 來取消定義符號。  
用 /define 或 #define 定義的符號與具有同一名稱的變量不沖突。 即,不應將變量名傳遞到預處理器指令,并且只能用預處理器指令計算符號。  
用 #define 創(chuàng)建的符號的范圍是在其中定義該符號的文件。  
示例  
 
復制  
// 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產生的遙控編碼是連續(xù)的32位二進制碼組,其中前16位為用戶識別碼,能區(qū)別不同的電器設備,防止不同機種遙控碼互相干擾。該芯片的用戶識別碼固定為十六進制01H;后16位為8位操作碼(功能碼)及其反碼。UPD6121G最多額128種不同組合的編碼。 
    遙控器在按鍵按下后,周期性地發(fā)出同一種32位二進制碼,周期約為108ms。一組碼本身的持續(xù)時間隨它包含的二進制“0”和“1”的個數(shù)不同而不同,大約在45~63ms之間,圖4為發(fā)射波形圖。 
     當一個鍵按下超過36ms,振蕩器使芯片激活,將發(fā)射一組108ms的編碼脈沖,這108ms發(fā)射代碼由一個起始碼(9ms),一個結果碼(4.5ms),低8位地址碼(9ms~18ms),高8位地址碼(9ms~18ms),8位數(shù)據(jù)碼(9ms~18ms)和這8位數(shù)據(jù)的反碼(9ms~18ms)組成。如果鍵按下超過108ms仍未松開,接下來發(fā)射的代碼(連發(fā)代碼)將僅由起始碼(9ms)和結束碼(2.5ms)組成。 
代碼格式(以接收代碼為準,接收代碼與發(fā)射代碼反向) 
        ①位定義 
      
 
單發(fā)代碼格式 
 

 
連發(fā)代碼格式 
 
 
注:代碼寬度算法: 16位地址碼的最短寬度:1.12×16=18ms 
16位地址碼的最長寬度:2.24ms×16=36ms 
易知8位數(shù)據(jù)代碼及其8位反代碼的寬度和不變:(1.12ms+2.24ms)×8=27ms 
∴32位代碼的寬度為(18ms+27ms~(36ms+27ms) 

1. 解碼的關鍵是如何識別“0”和“1”,從位的定義我們可以發(fā)現(xiàn)“0”、“1”均以0.56ms的低電平開始,不同的是高電平的寬度不同,“0”為0.56ms,“1”為1.68ms,所以必須根據(jù)高電平的寬度區(qū)別“0”和“1”。如果從0.56ms低電平過后,開始延時,0.56ms以后,若讀到的電平為低,說明該位為“0”,反之則為“1”,為了可靠起見,延時必須比0.56ms長些,但又不能超過1.12ms,否則如果該位為“0”,讀到的已是下一位的高電平,因此?。?.12ms+0.56ms)/2=0.84ms最為可靠,一般取0.84ms左右均可。 
2. 根據(jù)碼的格式,應該等待9ms的起始碼和4.5ms的結果碼完成后才能讀碼。 
 
     如果郵購我們開發(fā)的51單片機試驗板和擴展元件的網(wǎng)友,可以獲得如上圖所示的紅外遙控手柄,這種遙控器的編碼格式符合上面的描述規(guī)律,而且價格低廉,有32個按鍵,按鍵外形比較統(tǒng)一,如果用于批量開發(fā),可以把遙控器上貼膜換成你需要的字符,這為開發(fā)產品提供了便利。 
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寄存器操作模版 

謝謝~~嘿嘿

我這里有很多模塊程序

我只是想慢慢的學起來

慢慢的了解這款芯片的硬件資源~~~

不過還是謝謝~~

有什么問題,一定會請教

能不能留個聯(lián)系方式啊~~

0
回復
123sky
LV.2
19
2013-08-02 15:56
@dulai1985
謝謝~~嘿嘿我這里有很多模塊程序我只是想慢慢的學起來慢慢的了解這款芯片的硬件資源~~~不過還是謝謝~~有什么問題,一定會請教能不能留個聯(lián)系方式啊~~
可有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 記錄    記錄 對應 機器    / 或常量 數(shù) 據(jù)的十六   編碼數(shù)   成。Intel HEX 文件通常用于 傳輸將 被存于ROM 或者EPROM 中的程序和 數(shù) 據(jù)。大多數(shù) EPROM  程器或模 擬器使用Intel HEX 文件。
記錄 格式
Intel HEX
 由任意數(shù)量的十六   記錄組 成。每 個記錄 包含5  域, 它們按以下格式排列:
:llaaaatt[dd...]cc
每一組字母 對應   不同的域,每一  字母 對應   十六   編碼  數(shù) 字。每一  域由至少 兩個 十六   編碼數(shù)   成, 它們構 成一  節(jié) ,就像以下描述的那 樣:


每個Intel HEX 記錄 都由冒 號開頭 .
ll  數(shù) 據(jù)  度域,  代表 記錄當  數(shù) 據(jù)字 節(jié) (dd)  數(shù)量 .
aaaa 
是地址域, 它代表 記錄當  數(shù)據(jù)的起始地址 . 
tt 
是代表HEX 記錄類 型的域 ,  可能是以下 數(shù) 據(jù)  中的一 個:
    00 – 數(shù) 據(jù) 記錄
    01 – 文件  記錄
    02 – 擴展段地址 記錄
    04 – 擴  性地址 記錄
dd 是數(shù) 據(jù)域 ,  代表一   節(jié)  數(shù) 據(jù). 一 個記錄 可以有   數(shù) 據(jù)字 節(jié) . 記錄當  數(shù) 據(jù)字 節(jié)  數(shù) 量必   數(shù) 據(jù)  度域(ll) 中指定的 數(shù)字相符.
cc 
是校驗 和域 ,  表示 這個記錄 的校  . 校  和的  算是通 過將記錄當 中所有十六   編碼數(shù)     相加, 以256    行以下 .

表示為:“:[1字節(jié)長度][4字節(jié)地址][1字節(jié)記錄類型][數(shù)據(jù)段][校驗和] ”


數(shù) 據(jù) 記錄
Intel HEX文件由任意數(shù) 量以回 車換 行符  束的 數(shù) 據(jù) 記錄組 . 數(shù) 據(jù) 記錄  觀如下:
:10246200464C5549442050524F46494C4500464C33
其中:
10 
是這個記錄當 數(shù) 據(jù)字 節(jié)  數(shù)量.即0x10 
2462 
是數(shù)據(jù)  被下  到存   當中的地址.即0x2462 
00 
是記錄類( 數(shù) 據(jù) 記錄).即0x00 
464C…464C 數(shù)據(jù).分別代表0x46,0x4C... 
33 
是這個記錄的校 驗和.即0x33


  性地址 記錄(HEX386)
   性地址 記錄 也叫作32 位地址 記錄 HEX386 記錄 .   記錄 包含 數(shù) 據(jù)地址的高16 位.    性地址 記錄總 是有 兩個數(shù) 據(jù)字 節(jié) ,  觀如下:
:02000004FFFFFC
其中:
02 
是這個記錄當 數(shù) 據(jù)字 節(jié)  數(shù)量.
0000 
是地址域, 對    性地址 記錄 , 這個  總是0000.
04 
是記錄類 04(    性地址 記錄)
FFFF 是地址的高16 位.
FC 
是這個記錄的校  , 計算方法如下:
01h + NOT(02h + 00h + 00h + 04h + FFh + FFh).
 個擴   性地址 記錄   , 存   數(shù) 據(jù)域的    性地址被保存,    用于  Intel HEX 文件      后的 記錄 .  性地址保持有效, 直到  被另外一 個擴 展地址 記錄 所改 變.
   記錄當 中的地址域  被移位的      性地址 記錄 的地址 數(shù) 據(jù)相加   數(shù) 據(jù) 記錄  絕對  儲器地址.
以下的例子演示了這個過 程..
 數(shù) 據(jù) 記錄地址域的地址                       2462
  性地址 記錄  數(shù)據(jù)域                      + FFFF
                                  ------------
絕對  器地址                               FFFF2462

 展段地址 記錄(HEX86)
 展段地址 記錄 也叫HEX86 記錄 ,  包括4-19 位 數(shù) 據(jù)地址段.  展段地址 記錄總 是有 兩個數(shù) 據(jù)字 節(jié) ,  觀如下:
:020000021200EA
其中:
02 
是記錄當 數(shù) 據(jù)字 節(jié)  數(shù)量.
0000 
是地址域. 對  展段地址 記錄 , 這個  總是0000.
02 
是記錄類 02(  展段地址 記錄)
1200 是地址段.
EA 
是這個記錄的校  , 計算方法如下:
01h + NOT(02h + 00h + 00h + 02h + 12h + 00h).
 個擴 展段地址 記錄   , 存   數(shù) 據(jù)域的  展段地址被保存,    用于  Intel HEX 文件      后的 記錄 . 段地址保持有效,直到  被另外一 個擴 展地址 記錄 所改 變.
   記錄當 中的地址域  被移位的    展段地址 記錄 的地址 數(shù) 據(jù)相加   數(shù) 據(jù) 記錄  絕對  儲器地址.
以下的例子演示了這個過 程..
 數(shù) 據(jù) 記錄地址域的地址                             2462
展段地址 記錄數(shù)據(jù)域                      +  1200
                                 ---------
絕對  器地址                    00014462

文件  (EOF) 記錄
Intel HEX文件必 以文件  (EOF) 記錄結 . 這個記錄  記錄類 型域的    01.EOF 記錄  觀總是如下:
:00000001FF
其中:
00 
是記錄當 數(shù) 據(jù)字 節(jié)  數(shù)量.
0000 
是數(shù)據(jù)被下  到存    中的地址. 在文件   記錄當 中地址是  有意 義被忽略的.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 記錄 。 這 些 記錄由 對應 機器 語 言 碼 和/ 或常量 數(shù) 據(jù)的十六 進 制 編碼數(shù) 字 組 成。IntelHEX 文件通常用于 傳輸將 被存于ROM 或者EPROM 中的程序和 數(shù) 據(jù)。大多數(shù) EPROM 編 程器或模 擬器使用IntelHEX 文件。記錄 格式IntelHEX 由任意數(shù)量的十六 進 制 記錄組 成。每 個記錄 包含5 個 域, 它們按以下格式排列::llaaaatt[dd...]cc每一組字母 對應 一 個 不同的域,每一 個 字母 對應 一 個 十六 進 制 編碼 的 數(shù) 字。每一 個 域由至少 兩個 十六 進 制 編碼數(shù) 字 組 成, 它們構 成一個 字 節(jié) ,就像以下描述的那 樣:: 每個IntelHEX 記錄 都由冒 號開頭 .ll 是 數(shù) 據(jù) 長 度域, 它 代表 記錄當 中 數(shù) 據(jù)字 節(jié) (dd) 的 數(shù)量 .aaaa 是地址域, 它代表 記錄當 中 數(shù)據(jù)的起始地址 . tt 是代表HEX 記錄類 型的域 , 它 可能是以下 數(shù) 據(jù) 當 中的一 個:   00– 數(shù) 據(jù) 記錄   01–文件結 束 記錄   02–擴展段地址 記錄   04–擴展 線 性地址 記錄dd是數(shù) 據(jù)域 , 它 代表一 個 字 節(jié) 的 數(shù) 據(jù). 一 個記錄 可以有 許 多 數(shù) 據(jù)字 節(jié) . 記錄當 中 數(shù) 據(jù)字 節(jié) 的 數(shù) 量必 須 和 數(shù) 據(jù) 長 度域(ll) 中指定的 數(shù)字相符.cc 是校驗 和域 , 它 表示 這個記錄 的校 驗 和. 校 驗 和的 計 算是通 過將記錄當 中所有十六 進 制 編碼數(shù) 字 對 的 值 相加, 以256 為 模 進 行以下 補足.表示為:“:[1字節(jié)長度][4字節(jié)地址][1字節(jié)記錄類型][數(shù)據(jù)段][校驗和] ”數(shù) 據(jù) 記錄IntelHEX文件由任意數(shù) 量以回 車換 行符 結 束的 數(shù) 據(jù) 記錄組 成. 數(shù) 據(jù) 記錄 外 觀如下::10246200464C5549442050524F46494C4500464C33其中:10 是這個記錄當中 數(shù) 據(jù)字 節(jié) 的 數(shù)量.即0x10 2462 是數(shù)據(jù) 將 被下 載 到存 儲 器 當中的地址.即0x2462 00 是記錄類型( 數(shù) 據(jù) 記錄).即0x00 464C…464C是 數(shù)據(jù).分別代表0x46,0x4C... 33 是這個記錄的校 驗和.即0x33擴展 線 性地址 記錄(HEX386)擴 展 線 性地址 記錄 也叫作32 位地址 記錄 或HEX386 記錄 . 這 些 記錄 包含 數(shù) 據(jù)地址的高16 位. 擴 展 線 性地址 記錄總 是有 兩個數(shù) 據(jù)字 節(jié) , 外 觀如下::02000004FFFFFC其中:02 是這個記錄當中 數(shù) 據(jù)字 節(jié) 的 數(shù)量.0000 是地址域, 對于 擴 展 線 性地址 記錄 , 這個 域 總是0000.04 是記錄類型 04( 擴 展 線 性地址 記錄)FFFF是地址的高16 位.FC 是這個記錄的校 驗 和, 計算方法如下:01h+NOT(02h+00h+00h+04h+FFh+FFh).當一 個擴 展 線 性地址 記錄 被 讀 取, 存 儲 于 數(shù) 據(jù)域的 擴 展 線 性地址被保存, 它 被 應 用于 從 IntelHEX 文件 讀 取 來 的 隨 后的 記錄 . 線 性地址保持有效, 直到 它 被另外一 個擴 展地址 記錄 所改 變.通 過 把 記錄當 中的地址域 與 被移位的 來 自 擴 展 線 性地址 記錄 的地址 數(shù) 據(jù)相加 獲 得 數(shù) 據(jù) 記錄 的 絕對 存 儲器地址.以下的例子演示了這個過 程..來自 數(shù) 據(jù) 記錄地址域的地址             2462擴展 線 性地址 記錄 的 數(shù)據(jù)域            +FFFF                      ------------絕對存 儲 器地址                     FFFF2462擴 展段地址 記錄(HEX86)擴 展段地址 記錄 也叫HEX86 記錄 , 它 包括4-19 位 數(shù) 據(jù)地址段. 擴 展段地址 記錄總 是有 兩個數(shù) 據(jù)字 節(jié) , 外 觀如下::020000021200EA其中:02 是記錄當中 數(shù) 據(jù)字 節(jié) 的 數(shù)量.0000 是地址域. 對于 擴 展段地址 記錄 , 這個 域 總是0000.02 是記錄類型 02( 擴 展段地址 記錄)1200是地址段.EA 是這個記錄的校 驗 和, 計算方法如下:01h+NOT(02h+00h+00h+02h+12h+00h).當一 個擴 展段地址 記錄 被 讀 取, 存 儲 于 數(shù) 據(jù)域的 擴 展段地址被保存, 它 被 應 用于 從 IntelHEX 文件 讀 取 來 的 隨 后的 記錄 . 段地址保持有效,直到 它 被另外一 個擴 展地址 記錄 所改 變.通 過 把 記錄當 中的地址域 與 被移位的 來 自 擴 展段地址 記錄 的地址 數(shù) 據(jù)相加 獲 得 數(shù) 據(jù) 記錄 的 絕對 存 儲器地址.以下的例子演示了這個過 程..來自 數(shù) 據(jù) 記錄地址域的地址                2462擴展段地址 記錄數(shù)據(jù)域            +  1200                      ---------絕對存 儲 器地址              00014462文件 結 束(EOF) 記錄IntelHEX文件必須 以文件 結 束(EOF) 記錄結 束. 這個記錄 的 記錄類 型域的 值 必 須 是01.EOF 記錄 外 觀總是如下::00000001FF其中:00 是記錄當中 數(shù) 據(jù)字 節(jié) 的 數(shù)量.0000 是數(shù)據(jù)被下 載 到存 儲 器 當 中的地址. 在文件 結 束 記錄當 中地址是 沒 有意 義被忽略的.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碼表完整版 

下面開始學習用庫函數(shù)來學習串口通訊協(xié)議

從STM32手冊上看到了智能卡協(xié)議:

智能卡通信協(xié)議破解智能卡的基礎知識(轉)

 
智能卡無線小板相對于串口無線小板最大的不同是智能卡無線小板上的單片機要模仿真正的智能卡來發(fā)送和接收機頂盒的數(shù)據(jù),這部分功能將直接決定整個無線GX系統(tǒng)的穩(wěn)定性。
智能卡常用的通信協(xié)議有T0、T1和T14協(xié)議,關于這三種通信協(xié)議完整的介紹,在很多資料上都能找到,本文不再詳細闡述,有興趣的朋友可以查閱相關書籍。
本章節(jié)主要介紹BJST、YXTF、SMSX這三種智能卡的通信協(xié)議的關鍵技術和機頂盒智能卡命令、應答具體格式以及詳細說明。
首先介紹一下ATR(Answer To Reset,復位應答)。
當加上供電電壓、時鐘和復位信號后,智能卡經(jīng)DATA線送出其復位應答ATR。這個數(shù)據(jù)串最多含有33字節(jié),總是按分頻值(時鐘頻率轉換因子)為372傳送的,
這是遵照ISO/IEC7816-3標準的規(guī)定。它含有關于傳輸協(xié)議和卡的各種數(shù)據(jù),即使在ATR之后的傳輸協(xié)議使用的是不同的分頻值(例如:512),也應當用372這個分頻值來發(fā)送ATR。
這就保證了從任何卡總能接收到一個ATR,而不管傳輸協(xié)議的參數(shù)是怎樣的。需要大家注意的是,這里強調的是發(fā)送ATR的分頻值總是372,但是并沒有說發(fā)送ATR的波特率是固定的,波特率還要看機頂盒的智能卡槽的時鐘頻率是多少,ATR的波特率 = 機頂盒所加時鐘頻率/372。常用的機頂盒的智能卡槽的時鐘頻率有4.515MHz、4.9152MHz和3.5712MHz。
YXTF、 SMSX智能卡用到的是標準的T0協(xié)議。BJST所使用的協(xié)議類似于T1協(xié)議,單不是標準的T1協(xié)議,是一種介于T0協(xié)議和T1協(xié)議之間的協(xié)議,我們暫時稱之為TN協(xié)議。根據(jù)調試的經(jīng)驗,這三種智能卡都有一個規(guī)律:發(fā)送ATR的波特率和ATR之后的機頂盒命令、智能卡應答的波特率相同。
下面我們來看YXTF智能卡命令和應答(按時間先后順序)。
STB:機頂盒。
Card:智能卡。
STB -> Card:機頂盒發(fā)送給智能卡。
Card -> STB:智能卡發(fā)送給機頂盒。

智能卡命令或應答
傳輸方向,命令或應答的詳細說明

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個字節(jié)。

0x00 0xc0 0x00 0x00 0x04
STB -> Card。讀取智能卡號碼。

0xaa 0xbb 0xcc 0xdd0x90 0x00
Card -> STB。告知機頂盒智能卡號碼,并以0x90 0x00結尾告知機頂盒獲取智能卡號碼的命令被完整而成功地執(zhí)行。

0x80 0x46 0x00 0x00 0x040x03 0x00 0x00 0x09
STB -> Card。獲取智能卡年齡等級命令。

0x61 0x09
Card -> STB。告知機頂盒年齡等級信息占用0x09個字節(jié)

0x00 0xc0 0x00 0x00 0x09
STB -> Card。讀取智能卡年齡等級信息。

0x30 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x000x90 0x00
Card -> STB。告知機頂盒智能卡年齡等級信息,并以0x90 0x00結尾告知機頂盒獲取智能卡年齡等級的命令被完整而成功地執(zhí)行。

0x80 0x44 0x00 0x00 0x08
STB -> Card。讀取智能卡運營商信息。

0x17 0x17 0x00 0x00 0x00 0x0a 0x00 0x00 0x90 0x00
Card -> STB。告知機頂盒運營商信息,例如0x1717十進制為5911,表示第一個運營商是電話區(qū)號為0591的第一個城市。并以0x90 0x00結尾告知機頂盒獲取智能卡年齡等級的命令被完整而成功地執(zhí)行。

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。給卡發(fā)送四個配對字節(jié):0x5e 0xe4 0x82 0xf2,看是否能配對成功

0x90 0x00
Card -> STB。如果為0x90 0x00,說明四個配對字節(jié)與此卡配對成功。如果回復其他數(shù)據(jù),說明配對失敗。

0x80 0x46 0x17 0x17 0x040x04 0x00 0x00 0x48
STB -> Card。獲取運營商一產品包列表。其中0x17 0x17是運營商一的號碼。

0x61 0x48
Card -> STB。告知機頂盒運營商一產品包列表占用0x48個字節(jié)

0x00 0xc0 0x00 0x00 0x48
STB -> Card。讀取運營商一產品包列表。

0x00….. 0x00(共0x48個) 0x90 0x00
Card -> STB。返回運營商一產品包列表。并以0x90 0x00結尾告知機頂盒獲取運營商一產品包列表的命令被完整而成功地執(zhí)行。

0x80 0x48 0x17 0x17 0x040x81 0x00 0x00 0x3e
STB -> Card。獲取運營商一授權信息。其中0x17 0x17是運營商一的號碼。

0x61 0x27
Card -> STB。告知機頂盒運營商一授權信息占用0x27個字節(jié)

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。返回機頂盒運營商一授權信息。其中前三個字節(jié)0x00 0x00 0x09表示授權信息共有0x09條,以后每四個字節(jié)作為一條授權信息。例如0x00 0x01 0xff 0xfe表示ID號為65534(0xff fe)的節(jié)目,第二個字節(jié)0x01表示在界面上顯示此節(jié)目ID,第二個字節(jié)為0x00表示不顯示。

0x80 0x46 0x00 0x0a 0x040x04 0x00 0x00 0x48
STB -> Card。獲取運營商二產品包列表。其中0x00 0x0a是運營商二的號碼。

0x61 0x48
Card -> STB。告知機頂盒運營商二產品包列表占用0x48個字節(jié)

0x00 0xc0 0x00 0x00 0x48
STB -> Card。讀取運營商二產品包列表。

0x00….. 0x00(共0x48個) 0x90 0x00
Card -> STB。返回運營商二產品包列表。并以0x90 0x00結尾告知機頂盒獲取運營商二產品包列表的命令被完整而成功地執(zhí)行。

0x80 0x48 0x00 0x0a 0x040x81 0x00 0x00 0x3e
STB -> Card。獲取運營商二授權信息。其中0x00 0x0a是運營商二的號碼。

0x61 0x0b
Card -> STB。告知機頂盒運營商二授權信息占用0x0b個字節(jié)

0x00 0xc0 0x00 0x00 0x0b
STB -> Card。讀取運營商二授權信息。

0x00 0x00 0x02 0x00 0x00 0x00 0x00
0x00 0x00 0x00 0x010x90 0x00
Card -> STB。返回機頂盒運營商一授權信息。其中前三個字節(jié)0x00 0x00 0x02表示授權信息共有0x02條。分析方法同上面運營商一授權信息的分析方法。


上面是一個智能卡初始化比較全面的例子。一般的機頂盒不會有這么多初始化命令。
需要說明以下幾點:
第一, T0協(xié)議的長度字節(jié)在第五個字節(jié),長度字節(jié)加上5是整個命令的長度。

第二,按照T0協(xié)議,機頂盒首先發(fā)送命令的前五個字節(jié),等收到了PB(過程字節(jié))之后,再發(fā)送后面的字節(jié)。不足五個字節(jié)的命令一次發(fā)完。以讀取卡號的命令為例,第一步機頂盒先發(fā)送0x80 0x46 0x00 0x00 0x04;第二步智能卡選取第二個字節(jié)0x46作為過程字節(jié)回復機頂盒;第三步機頂盒再發(fā)送后面四個字節(jié)0x01 0x00 0x00 0x04;第四步智能卡回復0x61 0x04表示收到了機頂盒命令并成功執(zhí)行,返回0x04表示卡號信息是四個字節(jié);第五步機頂盒發(fā)送0x00 0xc0 0x00 0x00 0x04來讀取卡號;第六步智能卡選取第二個字節(jié)0x0c作為過程字節(jié)回復機頂盒;第七步智能卡發(fā)送卡號信息0xaa 0xbb 0xcc 0xdd  0x90 0x00,以0x90 0x00結尾表示收到了機頂盒命令并成功執(zhí)行。

第三,智能卡接收到五個字節(jié)回復第二個字節(jié)作為過程字節(jié),然后如何判斷這個命令是否已經(jīng)結束呢?方法是看開頭是否是0x00 0xc0開頭,如果是,此命令就是長度就是5,智能卡已經(jīng)收到了完整的數(shù)據(jù)了。比如讀取卡號命令0x00 0xc0 0x00 0x00 0x04,智能卡需要回復0x04個字節(jié)的卡號信息;如果不是0x00 0xc0開頭,比如0x80 0x46 0x00 0x00 0x04,說明這個命令還有0x04要發(fā)。當然也有一個例外,獲取運營商命令0x80 0x44 0x00 0x00 0x08,只有五個字節(jié)。我們在單片機程序設計中采用了這種方法。

第四,機卡配對技術將作為單獨的一章在后文中做詳細介紹。

機頂盒對智能卡完成這些初始化的“問題”后,就開始發(fā)送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字節(jié)。0x17 0x17是運營商號。


0x61 0x2b

Card -> STB。告知機頂盒運CW共0x2b個字節(jié),讓機頂盒來讀取。


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是用來解節(jié)目的有效數(shù)據(jù)。

如果用戶訪問運營商授權信息頁面,還有有以下的命令和回復。

智能卡命令或應答
傳輸方向,命令或應答的詳細說明

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。告知機頂盒運營商二授權信息。其中前三個字節(jié)0x00 0x00 0x02表示授權信息共有0x02條,以后每13個字節(jié)作為一條授權信息。具體解釋同下面運營商一授權信息的解釋。

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。告知機頂盒運營商一授權信息。
其中前三個字節(jié)0x00 0x00 0x09表示授權信息共有0x09條,以后每13個字節(jié)作為一條授權信息。例如0x00 0x01 0xff 0xfe 0x00 0x0e 0xdf 0x73 0x82 0x1d 0xf7 0xbf 0x7d表示ID為65534(0xff fe)的節(jié)目授權開始時間為0x0e 0xdf 0x73 0x82,結束時間為0x1d 0xf7 0xbf 0x7d,要在界面上顯示出來,沒有購買錄像。
第二個字節(jié),0x01表示要在機頂盒運營商授權信息頁面上顯示,0x00表示不顯示。
第五個字節(jié),0x00表示此節(jié)目沒有購買錄像,0x01表示此節(jié)目購買了錄像。

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個字節(jié)。

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結尾告知機頂盒獲取智能卡號碼的命令被完整而成功地執(zhí)行。其中83 50 11 06 82 31 73 13表示完整的智能卡卡號,也就是智能卡背面的條形碼號碼。0x04 0x11 0x22 0x33換算成相應的十進制68231731表示卡號從倒數(shù)第二位到倒數(shù)第九位的部分。

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字節(jié)。
0x60 0x61 0x2a


Card -> STB。告知機頂盒運CW共0x2a個字節(jié),讓機頂盒來讀取。
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是解加擾節(jié)目的關鍵數(shù)據(jù)。


BJST所使用的TN協(xié)議是一種介于T0和T1之間的協(xié)議,長度在第三個字節(jié)。這種協(xié)議不像T0協(xié)議那樣需要多次發(fā)送命令多次回復才能得到一條信息,TN協(xié)議只需要一問一答就能獲得一條信息。下面我們來看BJST智能卡命令和應答。


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


Card -> STB。BJST的ATR。18字節(jié)。

0x00 0x00 0x05

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

STB -> Card。初始命令一。第三個字節(jié)0x05加上4是整個命令的長度,最后一個字節(jié)0x91是前面所有字節(jié)異或后得到的校驗字節(jié)。

0x00 0x00 0x12

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


Card -> STB。回復初始命令一。第三個字節(jié)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字節(jié)。



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個字節(jié)是直接從智能卡里讀出來的,但并不是直接用來解節(jié)目的。這16個字節(jié),分為兩部分,前8個字節(jié)和后8個字節(jié),這兩部分的8個字節(jié)分別與CW的密鑰的8個字節(jié)異或之后才是真正用來解節(jié)目的信息。這是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]是真正用來解節(jié)目的信息。




程序設計者在設計程序時,無論是機頂盒還是智能卡無線小板上的單片機智能卡接口接收數(shù)據(jù),都要設計成首先接收前三個字節(jié),根據(jù)第三個字節(jié)再決定后面還有接收多少字節(jié)。


七、 破解機卡配對
所謂的機卡配對是指特定的某一張智能卡配上與之配對的一臺機頂盒才能解節(jié)目。有部分YXTF智能卡使用了這項技術,為GX帶來了麻煩。其實,只要知道了機卡配對的原理,要破解它也很容易。

在初始化YXTF智能卡時,如果命令0x80 0x4c 0x00 0x00 0x040 xff 0xff 0xff 0xff后智能卡的回復是0x94 0xb2,說明這張智能卡是需要機卡配對的。如果沒有給卡發(fā)送配對命令0x80 0x4c 0x00 0x00 0x04 0x5e 0xe4 0x82 0xf2,或者配對信息0x5e 0xe4 0x82 0xf2不對(每張卡的配對信息都不一樣),機頂盒在解需要機卡配對的節(jié)目時,解節(jié)目就會失敗。所以破解機卡配對的關鍵就在于給卡發(fā)送一個正確的機卡配對信息。在無線GX網(wǎng)絡中,作為子機的原裝機頂盒有機卡配對信息,但是母機沒有,這就需要母機事先“學習”子機的配對信息,下次母機開機是就不用再獲取子機的配對信息了。所謂母機的“學習”智能卡配對信息,就是在母機程序中加上一個功能:當子機將配對信息發(fā)給母機時,母機識別出此命令是配對命令(開命令的開頭是否是0x80 0x4c 0x00 0x00 0x04),母機就把0x80 0x4c 0x00 0x00 0x04后的四個字節(jié)寫到自己的FLASH中的一個文件yxtfkey.txt。等到下次開機時,母機從yxtfkey.txt讀出配對信息的四個字節(jié)去跟對應的智能卡配對。如果配對成功,智能卡就認為母機是與之配對的機頂盒,當收到需要機卡配對節(jié)目的ECM時,就會非?!绊槒摹睂⒄_的CW送出。所以,對于存在機卡配對的情況,只需對插卡的那臺機器(母機)做機卡配對。插卡的機器完成配對后,其所帶的所有無線網(wǎng)絡、局域網(wǎng)或廣域網(wǎng)的分機都不需要再做這個對應工作。如果母機沒有配對成功,母機需要下一次“學習”。

八、 關鍵技術
在無線GX系統(tǒng)中,比較關鍵的技術有以下幾點:

第一,
智能卡無線小板單片機定時器的時間設定。不同的機頂盒,智能卡的時鐘頻率是不一樣的,所以智能卡通信的波特率也不一樣。具體頻率是多少需要用示-波-器測量,然后計算出智能卡通信每位所占用的時間,從而進一步設定定時器的時間。如果機頂盒與智能卡還是不能順利的通信,需要用示-波-器對比讀真卡時數(shù)據(jù)的波形,調整定時器時間,讓智能卡無線小板DATA腳的波形模仿真卡的波形。根據(jù)調試的經(jīng)驗,一般情況,只要智能卡發(fā)送數(shù)據(jù)能被機頂盒正確接收,智能卡接收數(shù)據(jù)就沒有問題。

第二,
縮短使用T0通信協(xié)議智能卡的子機ECM和CW之間的時間間隔。機頂盒每次換臺時,如果換的新節(jié)目是加擾的,要向智能卡發(fā)送新的ECM。如果ECM和CW之間的時間間隔太長,換臺的時間間隔也很長,影響收看節(jié)目的質量。

以 YXTF無線GX為例,母機從發(fā)送ECM到CW的過程是:機頂盒發(fā)送ECM->智能卡解析ECM->智能卡回復0x61 0x2b->機頂盒發(fā)送0x00 0xc0 0x00 0x00 0x2b->智能卡回復CW。子機的這個過程可以是:機頂盒發(fā)送ECM->仿真智能卡回復0x61 0x2b->機頂盒發(fā)送0x00 0xc0 0x00 0x00 0x2b->無線發(fā)送ECM->母機解析出CW并將CW無線發(fā)給子機->仿真智能卡回復CW。但是“無線發(fā)送ECM”和“母機解析出 CW并將CW無線發(fā)給子機”包含無線傳輸和母機與真正智能卡對話這兩個過程,需要消耗約0.5s的時間,換臺時間比較長。我們可以統(tǒng)籌一下,一旦得到 ECM后就立刻無線發(fā)給母機,所以可以是:機頂盒發(fā)送ECM->仿真智能卡回復0x61 0x2b->無線發(fā)送ECM ->機頂盒發(fā)送0x00 0xc0 0x00 0x00 0x2b ->母機解析出CW并將CW無線發(fā)給子機->仿真智能卡回復CW。但是根據(jù)調試經(jīng)驗,這樣也有一個問題,無線發(fā)送ECM是一個連續(xù)的過程,大約需要消耗67ms,而機頂盒在收到0x61 0x2b后約50ms后就發(fā)出0x00 0xc0 0x00 0x00 0x2b。價格低廉的8位51核的單片機程序運行是實時單任務,也就是說單片機由于無線發(fā)送ECM而錯過了接收0x00 0xc0 0x00 0x00 0x2b,當然也就沒有回復過程字節(jié)0xc0,“聰明”一些的機頂盒會在3s之后重新發(fā)送0x00 0xc0 0x00 0x00 0x2b,這時單片機才會把過程字節(jié)0xc0和CW回復給機頂盒,這樣的話換臺時間將會變成恐怖的3s以上。沒有重發(fā)功能的機頂盒就認為沒有接收到CW,導致解節(jié)目失敗。所以我們要相辦法延遲機頂盒發(fā)送0x00 0xc0 0x00 0x00 0x2b,為此,我們可以按照以下流程設計:

總之一個原則是盡早把ECM發(fā)給母機,讓母機處理ECM與子機機頂盒和仿真智能卡的對話過程同時進行,等接收到了正確的CW,并且收到了子機發(fā)送的命令0x00 0xc0 0x00 0x00 0x2b ,立刻將CW發(fā)給子機。

第三,對于T0協(xié)議的智能卡,因為子機從發(fā)送ECM到得到CW包含了母機訪問真正智能卡的過程,所以縮短母機訪問真正智能卡這個過程的時間才是縮短子機換臺時間的根本。母機訪問真正智能卡時間的長短可以通過調整母機機頂盒的程序來調整

0
回復
dulai1985
LV.10
26
2013-10-24 15:51
@dulai1985
下面開始學習用庫函數(shù)來學習串口通訊協(xié)議從STM32手冊上看到了智能卡協(xié)議:智能卡通信協(xié)議破解智能卡的基礎知識(轉) 智能卡無線小板相對于串口無線小板最大的不同是智能卡無線小板上的單片機要模仿真正的智能卡來發(fā)送和接收機頂盒的數(shù)據(jù),這部分功能將直接決定整個無線GX系統(tǒng)的穩(wěn)定性。智能卡常用的通信協(xié)議有T0、T1和T14協(xié)議,關于這三種通信協(xié)議完整的介紹,在很多資料上都能找到,本文不再詳細闡述,有興趣的朋友可以查閱相關書籍。本章節(jié)主要介紹BJST、YXTF、SMSX這三種智能卡的通信協(xié)議的關鍵技術和機頂盒智能卡命令、應答具體格式以及詳細說明。首先介紹一下ATR(AnswerToReset,復位應答)。當加上供電電壓、時鐘和復位信號后,智能卡經(jīng)DATA線送出其復位應答ATR。這個數(shù)據(jù)串最多含有33字節(jié),總是按分頻值(時鐘頻率轉換因子)為372傳送的,這是遵照ISO/IEC7816-3標準的規(guī)定。它含有關于傳輸協(xié)議和卡的各種數(shù)據(jù),即使在ATR之后的傳輸協(xié)議使用的是不同的分頻值(例如:512),也應當用372這個分頻值來發(fā)送ATR。這就保證了從任何卡總能接收到一個ATR,而不管傳輸協(xié)議的參數(shù)是怎樣的。需要大家注意的是,這里強調的是發(fā)送ATR的分頻值總是372,但是并沒有說發(fā)送ATR的波特率是固定的,波特率還要看機頂盒的智能卡槽的時鐘頻率是多少,ATR的波特率=機頂盒所加時鐘頻率/372。常用的機頂盒的智能卡槽的時鐘頻率有4.515MHz、4.9152MHz和3.5712MHz。YXTF、SMSX智能卡用到的是標準的T0協(xié)議。BJST所使用的協(xié)議類似于T1協(xié)議,單不是標準的T1協(xié)議,是一種介于T0協(xié)議和T1協(xié)議之間的協(xié)議,我們暫時稱之為TN協(xié)議。根據(jù)調試的經(jīng)驗,這三種智能卡都有一個規(guī)律:發(fā)送ATR的波特率和ATR之后的機頂盒命令、智能卡應答的波特率相同。下面我們來看YXTF智能卡命令和應答(按時間先后順序)。STB:機頂盒。Card:智能卡。STB->Card:機頂盒發(fā)送給智能卡。Card->STB:智能卡發(fā)送給機頂盒。智能卡命令或應答傳輸方向,命令或應答的詳細說明0x3b0x6c0x000x000x4e0x540x490x430x300x910x690x000x4a0x030x000x00Card->STB。YXTF的ATR。0x000xa40x040x000x050xf90x5a0x540x000x06STB->Card。初始命令。0x900x00Card->STB。表示智能卡收到了正確的初始命令0x800x460x000x000x040x010x000x000x04STB->Card。獲取智能卡號碼命令。0x610x04Card->STB。告知機頂盒號碼占用0x04個字節(jié)。0x000xc00x000x000x04STB->Card。讀取智能卡號碼。0xaa0xbb0xcc0xdd0x900x00Card->STB。告知機頂盒智能卡號碼,并以0x900x00結尾告知機頂盒獲取智能卡號碼的命令被完整而成功地執(zhí)行。0x800x460x000x000x040x030x000x000x09STB->Card。獲取智能卡年齡等級命令。0x610x09Card->STB。告知機頂盒年齡等級信息占用0x09個字節(jié)0x000xc00x000x000x09STB->Card。讀取智能卡年齡等級信息。0x300x000x000x000x000x000x000x000x000x900x00Card->STB。告知機頂盒智能卡年齡等級信息,并以0x900x00結尾告知機頂盒獲取智能卡年齡等級的命令被完整而成功地執(zhí)行。0x800x440x000x000x08STB->Card。讀取智能卡運營商信息。0x170x170x000x000x000x0a0x000x000x900x00Card->STB。告知機頂盒運營商信息,例如0x1717十進制為5911,表示第一個運營商是電話區(qū)號為0591的第一個城市。并以0x900x00結尾告知機頂盒獲取智能卡年齡等級的命令被完整而成功地執(zhí)行。0x800x4c0x000x000x040xff0xff0xff0xffSTB->Card。檢查智能卡是否需要機卡配對。0x940xb2Card->STB。如果為0x940xb2,說明此卡需要機卡配對。如果為0x940xb1,說明此卡不需要機卡配對。0x800x4c0x000x000x040x5e0xe40x820xf2STB->Card。給卡發(fā)送四個配對字節(jié):0x5e0xe40x820xf2,看是否能配對成功0x900x00Card->STB。如果為0x900x00,說明四個配對字節(jié)與此卡配對成功。如果回復其他數(shù)據(jù),說明配對失敗。0x800x460x170x170x040x040x000x000x48STB->Card。獲取運營商一產品包列表。其中0x170x17是運營商一的號碼。0x610x48Card->STB。告知機頂盒運營商一產品包列表占用0x48個字節(jié)0x000xc00x000x000x48STB->Card。讀取運營商一產品包列表。0x00…..0x00(共0x48個)0x900x00Card->STB。返回運營商一產品包列表。并以0x900x00結尾告知機頂盒獲取運營商一產品包列表的命令被完整而成功地執(zhí)行。0x800x480x170x170x040x810x000x000x3eSTB->Card。獲取運營商一授權信息。其中0x170x17是運營商一的號碼。0x610x27Card->STB。告知機頂盒運營商一授權信息占用0x27個字節(jié)0x000xc00x000x000x27STB->Card。讀取運營商一授權信息。0x000x000x090x000x000x000x000x000x000x000x010x000x000x010x000x000x000x800x000x000x010xff0xfe0x000x000x000x020x000x010x000x010x000x010x000x020x000x010x000x040x900x00Card->STB。返回機頂盒運營商一授權信息。其中前三個字節(jié)0x000x000x09表示授權信息共有0x09條,以后每四個字節(jié)作為一條授權信息。例如0x000x010xff0xfe表示ID號為65534(0xfffe)的節(jié)目,第二個字節(jié)0x01表示在界面上顯示此節(jié)目ID,第二個字節(jié)為0x00表示不顯示。0x800x460x000x0a0x040x040x000x000x48STB->Card。獲取運營商二產品包列表。其中0x000x0a是運營商二的號碼。0x610x48Card->STB。告知機頂盒運營商二產品包列表占用0x48個字節(jié)0x000xc00x000x000x48STB->Card。讀取運營商二產品包列表。0x00…..0x00(共0x48個)0x900x00Card->STB。返回運營商二產品包列表。并以0x900x00結尾告知機頂盒獲取運營商二產品包列表的命令被完整而成功地執(zhí)行。0x800x480x000x0a0x040x810x000x000x3eSTB->Card。獲取運營商二授權信息。其中0x000x0a是運營商二的號碼。0x610x0bCard->STB。告知機頂盒運營商二授權信息占用0x0b個字節(jié)0x000xc00x000x000x0bSTB->Card。讀取運營商二授權信息。0x000x000x020x000x000x000x000x000x000x000x010x900x00Card->STB。返回機頂盒運營商一授權信息。其中前三個字節(jié)0x000x000x02表示授權信息共有0x02條。分析方法同上面運營商一授權信息的分析方法。上面是一個智能卡初始化比較全面的例子。一般的機頂盒不會有這么多初始化命令。需要說明以下幾點:第一,T0協(xié)議的長度字節(jié)在第五個字節(jié),長度字節(jié)加上5是整個命令的長度。第二,按照T0協(xié)議,機頂盒首先發(fā)送命令的前五個字節(jié),等收到了PB(過程字節(jié))之后,再發(fā)送后面的字節(jié)。不足五個字節(jié)的命令一次發(fā)完。以讀取卡號的命令為例,第一步機頂盒先發(fā)送0x800x460x000x000x04;第二步智能卡選取第二個字節(jié)0x46作為過程字節(jié)回復機頂盒;第三步機頂盒再發(fā)送后面四個字節(jié)0x010x000x000x04;第四步智能卡回復0x610x04表示收到了機頂盒命令并成功執(zhí)行,返回0x04表示卡號信息是四個字節(jié);第五步機頂盒發(fā)送0x000xc00x000x000x04來讀取卡號;第六步智能卡選取第二個字節(jié)0x0c作為過程字節(jié)回復機頂盒;第七步智能卡發(fā)送卡號信息0xaa0xbb0xcc0xdd  0x900x00,以0x900x00結尾表示收到了機頂盒命令并成功執(zhí)行。第三,智能卡接收到五個字節(jié)回復第二個字節(jié)作為過程字節(jié),然后如何判斷這個命令是否已經(jīng)結束呢?方法是看開頭是否是0x000xc0開頭,如果是,此命令就是長度就是5,智能卡已經(jīng)收到了完整的數(shù)據(jù)了。比如讀取卡號命令0x000xc00x000x000x04,智能卡需要回復0x04個字節(jié)的卡號信息;如果不是0x000xc0開頭,比如0x800x460x000x000x04,說明這個命令還有0x04要發(fā)。當然也有一個例外,獲取運營商命令0x800x440x000x000x08,只有五個字節(jié)。我們在單片機程序設計中采用了這種方法。第四,機卡配對技術將作為單獨的一章在后文中做詳細介紹。機頂盒對智能卡完成這些初始化的“問題”后,就開始發(fā)送ECM。0x800x3a0x170x170x530xd60x2f0xc00x440x0f0x370x940x7d0x020xba0xe00x6e0xa30x630x170x300xb30x8e0x820x5b0x810x9d0xd90x950x4d0xb00xd70x0d0x9f0x510xb60x570x020x090x000x010x000x010xd10x8f0xaa0x310xbe0x440xae0x400x8b0x2b0x450x120xda0xce0x500x330x090x000x010x000x030x1f0xc90xf90xbb0x800x9a0x100x880x110xd40x5d0x670xf90x3f0x300x120x470x5b0xfb0x510x650x200x340x51STB->Card。ECM,共88字節(jié)。0x170x17是運營商號。0x610x2bCard->STB。告知機頂盒運CW共0x2b個字節(jié),讓機頂盒來讀取。0x000xc00x000x000x2bSTB->Card。機頂盒讀取CW命令。0x0a0x170x170x440x0f0x370x940x7d0xab0xec0xe10x780x140x580xae0x1a0x4f0xec0x8d0xc80x500x3c0xbb0x470x000x0c0x5e0x000x010x000x000x000x000x000x000x000x000x000x000x000x000x000x00Card->STB。CW。0xab0xec0xe10x780x140x580xae0x1a0x4f0xec0x8d0xc80x500x3c0xbb0x47是用來解節(jié)目的有效數(shù)據(jù)。如果用戶訪問運營商授權信息頁面,還有有以下的命令和回復。智能卡命令或應答傳輸方向,命令或應答的詳細說明0x800x460x000x0a0x040x020x000x000x16STB->Card。獲取運營商二信息的命令。0x610x16Card->STB。0x000xc00x000x000x16STB->Card。讀取運營商二信息的命令。0x000x0a0x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x900x00Card->STB。告知機頂盒運營商二信息。0x800x460x170x170x040x020x000x000x16STB->Card。獲取運營商一信息的命令。0x610x16Card->STB。0x000xc00x000x000x16STB->Card。讀取運營商一信息的命令。0x170x170x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x900x00Card->STB。告知機頂盒運營商一信息。0x800x480x000x0a0x040x010x000x000x13STB->Card。獲取運營商二授權信息。0x610x1dCard->STB。0x000xc00x000x000x1dSTB->Card。讀取運營商二授權信息。0x000x000x020x000x000x000x000x000x0c0xd90x000x000x360x380xbf0x7d0x000x000x000x010x000x0b0xe70x510xa60x360x380xbf0x7d0x900x00Card->STB。告知機頂盒運營商二授權信息。其中前三個字節(jié)0x000x000x02表示授權信息共有0x02條,以后每13個字節(jié)作為一條授權信息。具體解釋同下面運營商一授權信息的解釋。0x800x480x000x0a0x040x020x000x000x14STB->Card。獲取運營商二未知信息。0x610x03Card->STB。0x000xc00x000x000x03STB->Card。讀取運營商二未知信息。0x000x000x000x900x00Card->STB。告知機頂盒運營商二未知信息。0x800x480x170x170x040x010x000x000x13STB->Card。獲取運營商一授權信息。0x610x78Card->STB。0x000x000x090x000x000x000x000x000x0c0xd90x000x000x360x380xbf0x7d0x000x000x000x010x000x0b0xe70x510xa60x360x380xbf0x7d0x000x000x010x000x000x0e0xdf0x730x820x1d0xf70xbf0x7d0x000x000x800x000x000x0e0xdf0x730x820x1d0xf70xbf0x7d0x000x010xff0xfe0x000x0e0xdf0x730x820x1d0xf70xbf0x7d0x000x000x000x020x000x0e0xdf0x730x820x1d0xf70xbf0x7d0x000x010x000x010x000x0e0x490x730x820x1d0xf70xbf0x7d0x000x010x000x020x000x0e0x490x730x820x0f0xb50xbf0x7d0x000x010x000x040x010x0e0x3d0x690x660x0f0x4b0x810xa50x900x00Card->STB。告知機頂盒運營商一授權信息。其中前三個字節(jié)0x000x000x09表示授權信息共有0x09條,以后每13個字節(jié)作為一條授權信息。例如0x000x010xff0xfe0x000x0e0xdf0x730x820x1d0xf70xbf0x7d表示ID為65534(0xfffe)的節(jié)目授權開始時間為0x0e0xdf0x730x82,結束時間為0x1d0xf70xbf0x7d,要在界面上顯示出來,沒有購買錄像。第二個字節(jié),0x01表示要在機頂盒運營商授權信息頁面上顯示,0x00表示不顯示。第五個字節(jié),0x00表示此節(jié)目沒有購買錄像,0x01表示此節(jié)目購買了錄像。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個字節(jié)。0x000xc00x000x000x67STB->Card。讀取智能卡號碼命令。0x000x010x64*0x040x110x220x33*0x830x500x110x060x820x310x730x13*0x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000xca0xfd0xc20xeb0xca0xd30xd10xb60x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x330x000x000x020x0b0x5c0x4b0xa70x090x900x00Card->STB。告知機頂盒智能卡號碼,并以0x900x00結尾告知機頂盒獲取智能卡號碼的命令被完整而成功地執(zhí)行。其中8350110682317313表示完整的智能卡卡號,也就是智能卡背面的條形碼號碼。0x040x110x220x33換算成相應的十進制68231731表示卡號從倒數(shù)第二位到倒數(shù)第九位的部分。0x800x320x000x000x440x810x300x410x000x040xce0x660xa30x4c0x7b0x890x700x500xd40x6b0xae0x0c0xb80xd80x530x2e0x740x120x030x5b0xcd0xc70x660xf60x8f0x0c0x960xa00xa00xee0x610xff0x120xb20xa90xea0xb30x160xef0x5e0xc80xf30x880xff0x770x040x4d0xf90x160xe00xac0x900x970x730x6b0x5e0x240xee0xfd0xc60xbc0xf40x71STB->Card。ECM,共73字節(jié)。0x600x610x2aCard->STB。告知機頂盒運CW共0x2a個字節(jié),讓機頂盒來讀取。0x000xc00x000x000x2aSTB->Card。機頂盒讀取CW命令。0x040xce0x840x030x000x010x000x840x030x000x030xb00xb40x040x000x000x000x000x830x160xd60x310x030x80*0xd00x8b0x020x5d*0x00*0x420x290x860xf10x820x1c0xfc0x9a*0x00*0x3e0x800x7c0x3a0x900x00Card->STB。CW。其中0xd00x8b0x020x5d,0x420x290x860xf10x820x1c0xfc0x9a,0x3e0x800x7c0x3a是解加擾節(jié)目的關鍵數(shù)據(jù)。BJST所使用的TN協(xié)議是一種介于T0和T1之間的協(xié)議,長度在第三個字節(jié)。這種協(xié)議不像T0協(xié)議那樣需要多次發(fā)送命令多次回復才能得到一條信息,TN協(xié)議只需要一問一答就能獲得一條信息。下面我們來看BJST智能卡命令和應答。0x3b0xe90x000x000x810x310xc30x450x990x630x740x690x190x990x120x560x100xecCard->STB。BJST的ATR。18字節(jié)。0x000x000x050x000x840x000x000x100x91STB->Card。初始命令一。第三個字節(jié)0x05加上4是整個命令的長度,最后一個字節(jié)0x91是前面所有字節(jié)異或后得到的校驗字節(jié)。0x000x000x120xe40x740x270xee0xd20x9d0xb00x250x5e0xa60x980x970xd60xbe0x100xbe0x900x000x30Card->STB。回復初始命令一。第三個字節(jié)0x12加上4是整個命令的長度。0x000x000x0e0x000x0c0x000x000x100xe40x740x270xee0xd20x9d0xb00x250x560xc7STB->Card。初始命令二。0x000x000x0a0xf10x3d0x020x840xcf0x510x0e0xe10x900x000xa1Card->STB?;貜统跏济疃?。0x000x000x0e0x000x0b0x000x000x100xf10x3d0x020x840xcf0x510x0e0xe10x560x78STB->Card。初始命令三。0x000x000x020x900x000x92Card->STB?;貜统跏济钊?x000x000x050x810xd40x000x010x050x54STB->Card。讀取智能卡卡號。0x000x000x070x000x000x010x330x110x900x000xb7Card->STB?;貜涂ㄌ栃畔ⅰF渲?x000x010x330x11換算成十進制78609是卡號。0x000x000x050x810xd00x000x010x080x5dSTB->Card。讀取智能卡解析CW的密鑰。0x000x000x0a0x240x3b0x450xd80xab0xf50x090xa60x900x000xe9Card->STB?;貜徒馕鯟W的密鑰。其中0x240x3b0x450xd80xab0xf50x090xa6是解析CW的密鑰。0x000x000x490x800xea0x80*0x000x160x000x000x3f0x900x030x000x000x1c0x850xa20x850x8b0x1e0x880x430x220x8b0xc90x6a0xc40x500x5c0xf40x1c0xfc0xb80xc60x630xe20x2b0x950xe90xe80x8e0xe20x170xcf0x930x070xa90xdc0x280x520x2e0xca0x210xc10x3c0xaf0x760x780x820x500x240x970xfe0x810xdb0x2a0x280xb10x0b0xbd0xd10x2a0x130x010x000xf0STB->Card。ECM。共77字節(jié)。0x000x000x130x720x7f0xca0xfa0xce0x530x210xd20xb80x4f0xaa0x9b0x3f0xa80xc50xbc0xe70x900x000x1fCard->STB。CW。其中0x7f0xca0xfa0xce0x530x210xd20xb80x4f0xaa0x9b0x3f0xa80xc50xbc0xe7是CW的關鍵信息。這里還需要大家要著重注意的一點是:這16個字節(jié)是直接從智能卡里讀出來的,但并不是直接用來解節(jié)目的。這16個字節(jié),分為兩部分,前8個字節(jié)和后8個字節(jié),這兩部分的8個字節(jié)分別與CW的密鑰的8個字節(jié)異或之后才是真正用來解節(jié)目的信息。這是BJST與YXTF、SMSX不同的地方。具體程序為for(i=0;i智能卡解析ECM->智能卡回復0x610x2b->機頂盒發(fā)送0x000xc00x000x000x2b->智能卡回復CW。子機的這個過程可以是:機頂盒發(fā)送ECM->仿真智能卡回復0x610x2b->機頂盒發(fā)送0x000xc00x000x000x2b->無線發(fā)送ECM->母機解析出CW并將CW無線發(fā)給子機->仿真智能卡回復CW。但是“無線發(fā)送ECM”和“母機解析出CW并將CW無線發(fā)給子機”包含無線傳輸和母機與真正智能卡對話這兩個過程,需要消耗約0.5s的時間,換臺時間比較長。我們可以統(tǒng)籌一下,一旦得到ECM后就立刻無線發(fā)給母機,所以可以是:機頂盒發(fā)送ECM->仿真智能卡回復0x610x2b->無線發(fā)送ECM->機頂盒發(fā)送0x000xc00x000x000x2b->母機解析出CW并將CW無線發(fā)給子機->仿真智能卡回復CW。但是根據(jù)調試經(jīng)驗,這樣也有一個問題,無線發(fā)送ECM是一個連續(xù)的過程,大約需要消耗67ms,而機頂盒在收到0x610x2b后約50ms后就發(fā)出0x000xc00x000x000x2b。價格低廉的8位51核的單片機程序運行是實時單任務,也就是說單片機由于無線發(fā)送ECM而錯過了接收0x000xc00x000x000x2b,當然也就沒有回復過程字節(jié)0xc0,“聰明”一些的機頂盒會在3s之后重新發(fā)送0x000xc00x000x000x2b,這時單片機才會把過程字節(jié)0xc0和CW回復給機頂盒,這樣的話換臺時間將會變成恐怖的3s以上。沒有重發(fā)功能的機頂盒就認為沒有接收到CW,導致解節(jié)目失敗。所以我們要相辦法延遲機頂盒發(fā)送0x000xc00x000x000x2b,為此,我們可以按照以下流程設計:總之一個原則是盡早把ECM發(fā)給母機,讓母機處理ECM與子機機頂盒和仿真智能卡的對話過程同時進行,等接收到了正確的CW,并且收到了子機發(fā)送的命令0x000xc00x000x000x2b,立刻將CW發(fā)給子機。第三,對于T0協(xié)議的智能卡,因為子機從發(fā)送ECM到得到CW包含了母機訪問真正智能卡的過程,所以縮短母機訪問真正智能卡這個過程的時間才是縮短子機換臺時間的根本。母機訪問真正智能卡時間的長短可以通過調整母機機頂盒的程序來調整
NRZ-1編碼
NRZ-I No Return Zero-Inverse   非歸零反相編碼
在NRZ-I編碼方式中,信號電平的一次反轉代表比特1。
就是說是從正電平到負電平的一次躍遷,而不是電壓值本身,來代表一個比特1。
0比特由沒有電平變化的信號代表。
非歸零反相編碼相對非歸零電平編碼的優(yōu)點在于:因為每次遇到比特1都發(fā)生電平躍遷,這能提供一種同步機制。
一串7個比特1會導致7次電平躍遷。
每次躍遷都使接收方能根據(jù)信號的實際到達來對本身時鐘進行重同步調整。
根據(jù)統(tǒng)計,連續(xù)的比特1出現(xiàn)的幾率比連續(xù)的比特0出現(xiàn)的幾率大,因此對比特 1的連續(xù)串進行同步就在保持整體消息同步上前進了一大步。
一串連續(xù)的比特0仍會造成麻煩,但由于連續(xù)0串出現(xiàn)不頻繁,對于解碼來說其妨礙就小了許多。
0
回復
dulai1985
LV.10
27
2013-11-08 13:30
@dulai1985
NRZ-1編碼NRZ-INoReturnZero-Inverse  非歸零反相編碼在NRZ-I編碼方式中,信號電平的一次反轉代表比特1。就是說是從正電平到負電平的一次躍遷,而不是電壓值本身,來代表一個比特1。0比特由沒有電平變化的信號代表。非歸零反相編碼相對非歸零電平編碼的優(yōu)點在于:因為每次遇到比特1都發(fā)生電平躍遷,這能提供一種同步機制。一串7個比特1會導致7次電平躍遷。每次躍遷都使接收方能根據(jù)信號的實際到達來對本身時鐘進行重同步調整。根據(jù)統(tǒng)計,連續(xù)的比特1出現(xiàn)的幾率比連續(xù)的比特0出現(xiàn)的幾率大,因此對比特1的連續(xù)串進行同步就在保持整體消息同步上前進了一大步。一串連續(xù)的比特0仍會造成麻煩,但由于連續(xù)0串出現(xiàn)不頻繁,對于解碼來說其妨礙就小了許多。
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
回復
發(fā)