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

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

STM32的學(xué)習(xí)總結(jié)~~

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

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

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

總結(jié)的東西在哪呀,我也是來學(xué)習(xí)的!

0
回復(fù)
dulai1985
LV.10
3
2013-07-20 14:56
@斌520
總結(jié)的東西在哪呀,我也是來學(xué)習(xí)的!
(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 時會導(dǎo)致掛 
起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
回復(fù)
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)默認(rèn)為:int, 即,有符號整數(shù)。



0
回復(fù)
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的結(jié)果是一個unsigned long int 數(shù),這個數(shù)的大小是 
1<<16


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

uCOS里面的時間管理關(guān)鍵宏定義OS_TICKS_PER_SEC

OS_TICKS_PER_SEC這個東西表示CPU一秒鐘進(jìn)行多少次時鐘中斷,也就決定了最小的延時間隔,比如OS_TICKS_PER_SEC設(shè)置成100,則表示1s里面會發(fā)生100次時鐘中斷,也就是10ms來一次中斷,則最小的延時單位就是10ms。

在LM3S平臺下移植ucos,用systick來做時間管理的時鐘源的話,初始化的時候是這樣寫的:

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

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

 


0
回復(fù)
dulai1985
LV.10
12
2013-07-25 13:13
@dulai1985
[圖片] 

  

0
回復(fù)
07611128
LV.2
13
2013-07-25 23:24
@dulai1985
[圖片] 

師長啊,有點(diǎn)小亂啊……

0
回復(fù)
dulai1985
LV.10
14
2013-07-26 08:44
@07611128
師長啊,有點(diǎn)小亂啊……

說了這是學(xué)習(xí)筆記

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

0
回復(fù)
dulai1985
LV.10
15
2013-07-31 13:21
@dulai1985
說了這是學(xué)習(xí)筆記自己不懂的地方才發(fā)出來的哈哈~~~
#if(C# 參考) 
如果 C# 編譯器遇到最后面跟有 #endif 指令的 #if 指令,則僅當(dāng)指定的符號已定義時,它才會編譯這兩個指令之間的代碼。 與 C 和 C++ 不同,您不能對符號賦予數(shù)值;C# 中的 #if 語句是 Boolean,僅測試符號是否已定義。 例如,  復(fù)制  
#define DEBUG // ... #if DEBUG 
    Console.WriteLine("Debug version"); #endif 
使用運(yùn)算符 ==(相等)和 !=(不相等)只能測試出結(jié)果為 true 還是 false。 True 表示符號已定義。 語句 #if DEBUG 與 #if (DEBUG == true) 的含義相同。 運(yùn)算符 &&(與)和 ||(或)可用來評估多個符號是否已定義。 還可以用括號將符號和運(yùn)算符分組。  
 
結(jié)合使用 #if 與 #else、#elif、#endif、#define 和 #undef 指令,可以根據(jù)一個或多個符號是否存在來包含或排除代碼。 在編譯調(diào)試版本的代碼或針對特定配置進(jìn)行編譯時,這會很有用。  以 #if 指令開始的條件指令必須用 #endif 指令顯式終止。  
#define 使您可以定義一個符號,通過將該符號用作傳遞給 #if 指令的表達(dá)式,使該表達(dá)式計算為 true。  
也可以用 /define 編譯器選項(xiàng)來定義符號。 可以用 #undef 來取消定義符號。  
用 /define 或 #define 定義的符號與具有同一名稱的變量不沖突。 即,不應(yīng)將變量名傳遞到預(yù)處理器指令,并且只能用預(yù)處理器指令計算符號。  
用 #define 創(chuàng)建的符號的范圍是在其中定義該符號的文件。  
示例  
 
復(fù)制  
// 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 指令開頭的條件指令的結(jié)尾。 例如,  
#define DEBUG // ... #if DEBUG 
    Console.WriteLine("Debug version"); #endif 
以 #if 指令開始的條件指令必須用 #endif 指令顯式終止。 有關(guān)如何使用 #endif 的示例參見#if
0
回復(fù)
dulai1985
LV.10
16
2013-08-01 08:56
 UPD6121G產(chǎn)生的遙控編碼是連續(xù)的32位二進(jìn)制碼組,其中前16位為用戶識別碼,能區(qū)別不同的電器設(shè)備,防止不同機(jī)種遙控碼互相干擾。該芯片的用戶識別碼固定為十六進(jìn)制01H;后16位為8位操作碼(功能碼)及其反碼。UPD6121G最多額128種不同組合的編碼。 
    遙控器在按鍵按下后,周期性地發(fā)出同一種32位二進(jìn)制碼,周期約為108ms。一組碼本身的持續(xù)時間隨它包含的二進(jìn)制“0”和“1”的個數(shù)不同而不同,大約在45~63ms之間,圖4為發(fā)射波形圖。 
     當(dāng)一個鍵按下超過36ms,振蕩器使芯片激活,將發(fā)射一組108ms的編碼脈沖,這108ms發(fā)射代碼由一個起始碼(9ms),一個結(jié)果碼(4.5ms),低8位地址碼(9ms~18ms),高8位地址碼(9ms~18ms),8位數(shù)據(jù)碼(9ms~18ms)和這8位數(shù)據(jù)的反碼(9ms~18ms)組成。如果鍵按下超過108ms仍未松開,接下來發(fā)射的代碼(連發(fā)代碼)將僅由起始碼(9ms)和結(jié)束碼(2.5ms)組成。 
代碼格式(以接收代碼為準(zhǔn),接收代碼與發(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. 解碼的關(guān)鍵是如何識別“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ù)碼的格式,應(yīng)該等待9ms的起始碼和4.5ms的結(jié)果碼完成后才能讀碼。 
 
     如果郵購我們開發(fā)的51單片機(jī)試驗(yàn)板和擴(kuò)展元件的網(wǎng)友,可以獲得如上圖所示的紅外遙控手柄,這種遙控器的編碼格式符合上面的描述規(guī)律,而且價格低廉,有32個按鍵,按鍵外形比較統(tǒng)一,如果用于批量開發(fā),可以把遙控器上貼膜換成你需要的字符,這為開發(fā)產(chǎn)品提供了便利。 
0
回復(fù)
619216213
LV.5
17
2013-08-01 21:37
給一樓正下樓,stm32寄存器操作模版,自己寫的,流水燈測試程序,想要寫別的功能自己修改就行stm32寄存器操作模版 
0
回復(fù)
dulai1985
LV.10
18
2013-08-02 08:33
@619216213
給一樓正下樓,stm32寄存器操作模版,自己寫的,流水燈測試程序,想要寫別的功能自己修改就行[圖片]stm32寄存器操作模版 

謝謝~~嘿嘿

我這里有很多模塊程序

我只是想慢慢的學(xué)起來

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

不過還是謝謝~~

有什么問題,一定會請教

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

0
回復(fù)
123sky
LV.2
19
2013-08-02 15:56
@dulai1985
謝謝~~嘿嘿我這里有很多模塊程序我只是想慢慢的學(xué)起來慢慢的了解這款芯片的硬件資源~~~不過還是謝謝~~有什么問題,一定會請教能不能留個聯(lián)系方式啊~~
可有spwm的模塊程序?
0
回復(fù)
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
回復(fù)
dulai1985
LV.10
21
2013-08-20 10:13
@cunwmy
LZ幫忙講解一下RTOS吧。
嘿嘿,我也是初學(xué)者~~~
0
回復(fù)
2013-09-02 17:59
@123sky
可有spwm的模塊程序?
這個我沒有??!
0
回復(fù)
dulai1985
LV.10
23
2013-09-28 10:29
@阿信博客
這個我沒有??!

Intel HEX 文件是由一行行符合Intel HEX 文件格式的文本所 構(gòu) 成的ASCII 文本文件。在Intel HEX 文件中,每一行包含一  HEX 記錄 。   記錄 對應(yīng) 機(jī)器    / 或常量 數(shù) 據(jù)的十六 進(jìn)  編碼數(shù)   成。Intel HEX 文件通常用于 傳輸將 被存于ROM 或者EPROM 中的程序和 數(shù) 據(jù)。大多數(shù) EPROM  程器或模 擬器使用Intel HEX 文件。
記錄 格式
Intel HEX
 由任意數(shù)量的十六 進(jìn)  記錄組 成。每 個記錄 包含5  域, 它們按以下格式排列:
:llaaaatt[dd...]cc
每一組字母 對應(yīng)   不同的域,每一  字母 對應(yīng)   十六 進(jìn)  編碼  數(shù) 字。每一  域由至少 兩個 十六 進(jìn)  編碼數(shù)   成, 它們構(gòu) 成一  節(jié) ,就像以下描述的那 樣:


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

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


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


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

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

文件 結(jié) (EOF) 記錄
Intel HEX文件必 以文件 結(jié) (EOF) 記錄結(jié) . 這個記錄  記錄類 型域的    01.EOF 記錄  觀總是如下:
:00000001FF
其中:
00 
是記錄當(dāng) 數(shù) 據(jù)字 節(jié)  數(shù)量.
0000 
是數(shù)據(jù)被下  到存   當(dāng) 中的地址. 在文件 結(jié)  記錄當(dāng) 中地址是  有意 義被忽略的.0000h 是典型的地址.
01 
是記錄類 01( 文件 結(jié)  記錄)
FF  這個記錄 的校 驗(yàn) , 計算方法如下:
01h + NOT(00h + 00h + 00h + 01h).


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

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

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

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

智能卡通信協(xié)議破解智能卡的基礎(chǔ)知識(轉(zhuǎn))

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

智能卡命令或應(yīng)答
傳輸方向,命令或應(yīng)答的詳細(xì)說明

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。告知機(jī)頂盒號碼占用0x04個字節(jié)。

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

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

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

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

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

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

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

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

0x80 0x4c 0x00 0x00 0x040xff 0xff 0xff 0xff
STB -> Card。檢查智能卡是否需要機(jī)卡配對。

0x94 0xb2
Card -> STB。如果為0x94 0xb2,說明此卡需要機(jī)卡配對。如果為0x94 0xb1,說明此卡不需要機(jī)卡配對。

0x80 0x4c 0x00 0x00 0x040x5e 0xe4 0x82 0xf2
STB -> Card。給卡發(fā)送四個配對字節(jié):0x5e 0xe4 0x82 0xf2,看是否能配對成功

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

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

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

0x00 0xc0 0x00 0x00 0x48
STB -> Card。讀取運(yùn)營商一產(chǎn)品包列表。

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

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

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

0x00 0xc0 0x00 0x00 0x27
STB -> Card。讀取運(yùn)營商一授權(quán)信息。

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。返回機(jī)頂盒運(yùn)營商一授權(quán)信息。其中前三個字節(jié)0x00 0x00 0x09表示授權(quán)信息共有0x09條,以后每四個字節(jié)作為一條授權(quán)信息。例如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。獲取運(yùn)營商二產(chǎn)品包列表。其中0x00 0x0a是運(yùn)營商二的號碼。

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

0x00 0xc0 0x00 0x00 0x48
STB -> Card。讀取運(yùn)營商二產(chǎn)品包列表。

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

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

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

0x00 0xc0 0x00 0x00 0x0b
STB -> Card。讀取運(yùn)營商二授權(quán)信息。

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


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

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

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

第四,機(jī)卡配對技術(shù)將作為單獨(dú)的一章在后文中做詳細(xì)介紹。

機(jī)頂盒對智能卡完成這些初始化的“問題”后,就開始發(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是運(yùn)營商號。


0x61 0x2b

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


0x00 0xc0 0x00 0x00 0x2b

STB -> Card。機(jī)頂盒讀取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ù)。

如果用戶訪問運(yùn)營商授權(quán)信息頁面,還有有以下的命令和回復(fù)。

智能卡命令或應(yīng)答
傳輸方向,命令或應(yīng)答的詳細(xì)說明

0x80 0x46 0x00 0x0a 0x040x02 0x00 0x00 0x16
STB -> Card。獲取運(yùn)營商二信息的命令。

0x61 0x16
Card -> STB。

0x00 0xc0 0x00 0x00 0x16
STB -> Card。讀取運(yùn)營商二信息的命令。

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。告知機(jī)頂盒運(yùn)營商二信息。

0x80 0x46 0x17 0x17 0x040x02 0x00 0x00 0x16
STB -> Card。獲取運(yùn)營商一信息的命令。

0x61 0x16
Card -> STB。

0x00 0xc0 0x00 0x00 0x16
STB -> Card。讀取運(yùn)營商一信息的命令。

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。告知機(jī)頂盒運(yùn)營商一信息。

0x80 0x48 0x00 0x0a 0x040x01 0x00 0x00 0x13
STB -> Card。獲取運(yùn)營商二授權(quán)信息。

0x61 0x1d
Card -> STB。

0x00 0xc0 0x00 0x00 0x1d
STB -> Card。讀取運(yùn)營商二授權(quán)信息。

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

0x80 0x48 0x00 0x0a 0x040x02 0x00 0x00 0x14
STB -> Card。獲取運(yùn)營商二未知信息。

0x61 0x03
Card -> STB。

0x00 0xc0 0x00 0x00 0x03
STB -> Card。讀取運(yùn)營商二未知信息。

0x00 0x00 0x000x90 0x00
Card -> STB。告知機(jī)頂盒運(yùn)營商二未知信息。

0x80 0x48 0x17 0x17 0x040x01 0x00 0x00 0x13
STB -> Card。獲取運(yùn)營商一授權(quán)信息。

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

0x80 0x48 0x17 0x17 0x040x02 0x00 0x00 0x14
STB -> Card。獲取運(yùn)營商一未知信息。

0x61 0x03
Card -> STB。

0x00 0xc0 0x00 0x00 0x03
STB -> Card。讀取運(yùn)營商一未知信息。

0x00 0x00 0x000x90 0x00
Card -> STB。告知機(jī)頂盒運(yùn)營商一未知信息。



下面我們來看SMSX智能卡命令和應(yīng)答。SMSX與YXTF應(yīng)答和命令比較相似。

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。告知機(jī)頂盒號碼信息占用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。告知機(jī)頂盒智能卡號碼,并以0x90 0x00結(jié)尾告知機(jī)頂盒獲取智能卡號碼的命令被完整而成功地執(zhí)行。其中83 50 11 06 82 31 73 13表示完整的智能卡卡號,也就是智能卡背面的條形碼號碼。0x04 0x11 0x22 0x33換算成相應(yīng)的十進(jìn)制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。告知機(jī)頂盒運(yùn)CW共0x2a個字節(jié),讓機(jī)頂盒來讀取。
0x00 0xc0 0x00 0x00 0x2a

STB -> Card。機(jī)頂盒讀取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é)目的關(guān)鍵數(shù)據(jù)。


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


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é)異或后得到的校驗(yàn)字節(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?;貜?fù)初始命令一。第三個字節(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?;貜?fù)初始命令二。



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?;貜?fù)初始命令三。



0x00 0x00 0x05

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


STB -> Card。讀取智能卡卡號。



0x00 0x00 0x07

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


Card -> STB?;貜?fù)卡號信息。其中0x00 0x01 0x33 0x11換算成十進(jìn)制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?;貜?fù)解析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的關(guān)鍵信息。這里還需要大家要著重注意的一點(diǎn)是:這16個字節(jié)是直接從智能卡里讀出來的,但并不是直接用來解節(jié)目的。這16個字節(jié),分為兩部分,前8個字節(jié)和后8個字節(jié),這兩部分的8個字節(jié)分別與CW的密鑰的8個字節(jié)異或之后才是真正用來解節(jié)目的信息。這是BJST與YXTF、SMSX不同的地方。具體程序?yàn)?br />
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è)計者在設(shè)計程序時,無論是機(jī)頂盒還是智能卡無線小板上的單片機(jī)智能卡接口接收數(shù)據(jù),都要設(shè)計成首先接收前三個字節(jié),根據(jù)第三個字節(jié)再決定后面還有接收多少字節(jié)。


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

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

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

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

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

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

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

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

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