2019年12月30日 星期一

DSP TI TMS320F283xx eCAN module control 與 Bit-Timing設定



在設定TI DSP的eCAN module,最先要了解的是主控暫存器與Bit-Timing設定,
這篇會寫到暫存器內,有那些位元,要如何設置。另外CAN Bit-Timing的設定
會影響到與其他CAN裝置的通訊,需要仔細調試。

CAN Master control register(主控暫存器)











CANMC.SUSP:在Suspend,設為"1"為Free,持續CAN通信。設為"0"為Soft,
                             當前訊息發完就關閉。
CANMC.MBCC:設定在SCC模式下,受EALLOW保護。設為"1", 在成功收發
                             Mail16,便清除mail conunter。
CANMC.TCC:設"1"去清除Mail counter的MSB BIT,TCC Bit會在一個時鐘
                           周期後,自動清除為"0"。
CANMC.SCB:設"1"為選擇eCAN模式,設"0"為選擇SCC模式。
CANMC.CCR:改變配置請求位元,在SCC模式下,要對CANBTC、                
                           CANGAM、LAM0、LAM3寫入設定,需要先將CCR bit設為"1", 
                           並等到CANES的CCE顯示為"1"(表示同意後),才能去修改這些
                           暫存器的設定。
CAMMC.PDR:本地斷電請求,設PDR位元"1" ,請求將eCAN模組進斷電模
                            式,也包括將eCAN模組Clock關閉。
CAMMC.DBO:傳送/接收資料位元組順序,設DBO為"1",從最低位元組先傳
                             收。設為"0",則從最高位先組傳收。
CAMMC.WUBA:喚醒Bus線方式,設為"1",當Bus線上有活動,就將eCAN模
                                組從斷電模式中喚醒。設為"0",只能寫入PDR bit來喚醒。
CAMMC.CDR:改變數據區域請求,在更改CAMMC.MBNR 4:0的區塊資料之
                             前,需要先將CDR bit設為"1",在更改完後,要將CDR bit設
                             為"0"。在CDR bit為"1"時,eCAN模組不會傳送那個Mailbox的
                             內容。
CAMMC.ABO:自動Bus開啟位元,ABO設為"1"時,在Bus off狀態,在偵測到
                             第128*11個隱性位元後,自動回到Bus on狀態。ABO設
                             為"0"時,在Bus off時,要檢測到連續128*11隱性位元並且CCR
                             位元已經被清除,才會回到Bus on狀態。
CAMMC.STM:自我測試模式,在設為"1"後,進入自我測試模式,eCAN模組
                             能自已產生Ack回應,不需要在Bus上連接其他的模組,發出去
                            的資料會存在合適的mailbox,能被讀取。
CAMMC.SRES:軟體重置位元,寫入"1",就能對模組進行軟體重置,所有的
                              暫存器參數,除了被保護的,都會被重置回初始設定。
CAMMC.MBNR:有MBNR[4:0]共5個bit,MBNR[4]只有用在eCAN,在SCC無
                                效。設定Mailbox編號,CPU請求是對應的Mailbox要被用來寫
                               入料。與CDR搭配使用。


CAN傳輸速率配置


















CAN規範裡,將一個Bit Timing分成四個時間區段,裡面的單位為TQ(Time
 Quantum)圖中的TSEG1,TSEG2、SYNCSEG、SJW都是以TQ為單位。
1.SYNC_SEQ:同步節點,長度為1個TQ。
2.PROG_SEQ:用來補CAN網路裡的物理延遲時間(兩倍於Bus線上的信號傳播
                            延遲,這個延遲包括了輸入比較延遲與輸出驅動延遲),可以設
                            為1~8個TC。
3.Phase_SEG1:上升邊緣相位補償
4.Phase_SEG2:下降邊緣相位補償
5.SJW:同步跳轉寬度,用來增大或減小CAN Baudrate的容許偏差量。
5.Sample point:在每個BIT裡TSEG1與TSEG2之間,採樣點的位置,可以透過調
                              整TSEG1與TSEG2各自的長度,來調整。取樣位置不能太前也
                              不能太後面,不然可能會取到上升沿或下降沿。一般取樣位置
                               設定在50%之後,等待信號穩定再取樣,建議在75%~85%之
                               間。

CAN Bit-Timing Configuration register(位元時序設置暫存器)







CANBTC.BRPBRP為Baud rate分頻器設定,TQ=(BRP+1)/BaseCLK。
                            在283xx, 2803x的BaseCLK=SYSCLKOUT/2。
                            在281x, 280x與2801x的BaseCLK=SYSCLKOUT。
                             SYSCLKOUT是CAN module的系統時鐘。
CANBTC.TSEG1:為PROG_SEQ+Phase_SEG1
CANBTC.TSEG2:為Phase_SEQ2。
CANBTC.SJW:SJW可設定1~4個TQ,SJW的值直接影响到重同步時相位緩沖 
                             段的可調節範圍。選擇3、4可以使BUS線上獲得到更大的
                             Baudrate容許偏差量,一般的要求是3%以上。容許的偏差量太
                             低,通訊失敗的機率就會增加。
CANBTC.SAM:數據樣次數設置,"0"表示每個樣點只採1次,"1"在BRP>4
                              時每個採樣點採3次(多數決)。三次採樣是為了過濾掉Bus線上
                              的毛剌,但採用三次採樣可能會影響到SJW跳轉,所以一般
                              選用單次採樣。

Bit timing設置
當BRP設為49,BaseCLKK為SYSCLKOUT/2=75MHz,
TQ=50/75MHZ=0.667us。假設TSEG1=11個TQ,TSEG2=3個TQ
就可以得到tCAN=SYNCSEG+TSEG1+TSEG2=15個TQ=10us。
在這個範例可以設定CAN的Bit time為10us,速度為100kbit/s。



Reference
1.TMS320x2833x, 2823x DSP Enhanced Controller Area Network (eCAN) User's Guide
2.https://zhuanlan.zhihu.com/p/38299092

2019年9月30日 星期一

DSP TI TMS320F28335 I2C設置


I2C由SDA在收發資料,由SCL來傳送資料的Clock,Clock讓I2C傳送端與接收端可以
同步,每一個Clock代表一個bit。如下圖,TM320320F28335包含了control、status、
interrupt等暫存器,讓使用者可以藉由設置或讀取這這些暫存器來客制化I2C功能。

I2C發送與接收
當CPU要從SDA資料線傳送資料出去,是將資料寫入I2CDXR,I2CDXR會再將資料
轉到I2CXSR後,發送中斷信號XRDY,讓CPU知道資料已經被發送出去。

CPU要從SDA接收資料,資料是先被存到I2CRSR,在I2CRSR將資料更新到I2CDRR
後,發出中斷信號RRDY,讓CPU知道I2C module接收到新的資料,可以去讀取。


























I2C Clock設定
當TMS320F28335被設為I2C Master,要設置I2C SCL的Clock頻率,從下圖Figure 3
看到從Device input clock經過PLLCR,再到I2C Moudle IPSC、ICCL/ICC這三個除
頻器,最後產生出Master clock做為SCL的clock。TMS320F28335支援I2C頻率
10K~400KHz,為了要符合這個頻率區間,Moudule clock需要在7-12MHz。
在設定IPSC時,I2CMDR裡的IRS要設為"0"(reset state),如果在IRS為"1"時,修
改IPSC是無效的。
















Master clock公式
要得到Tmst(Master clock period),就要先得到Tmod(module clockperiod)、ICCL
、ICCH與d的值。而module clock由input clock除以 (IPSC+1)得出。另外d (delay)
的值如Table 15, 可以得知與IPSC的值有關,為5、6、7其中之1。

IPSC由暫存器I2CPSC.bit7:0來設定,範圍是 0~255。當IPSC設為"0",就表示
module clock=I2C input clock。在TI的Example code裡,I2C input clock有100MHz
、150MHz兩種設定,為了讓Module clock降到10MHz,符合7~12MHz的範圍,
在I2C input clock為100MHz時,就設IPSC為9,在150MHz時,設IPSC為14。
再來因為IPSC>1,所以d(delay)=5。

Tmod周期時間為module clock的倒數,Tmmod=1/10MHz=0.1us,再設置ICCL與
ICCH就可以得到Tmst。在TI的Example code裡,設置ICCL=10, ICCH=5,代入
公式,可以得到Tmst=Tmod x [(10+5) + (5+5)]=0.1us x 25= 2.5us,最後得出
Master clock= 1/ Tmst= 400KHz。









從Figure22可以看到,Tmst是Tmod所計算出來的。










I2C中斷事件
I2C有7個中斷事件,在Figure13可以看到,每個中斷事件,可以由I2CIER去設置
enable/disable,被設為disable的中斷事件,在事件發生時,就不會去通知CPU。
I2CSTR(I2C status register)裡面所對應的bit會會被設"1"。

XRDYINT:用來通知CPU,原來I2CDXR內資料已經傳送出去,可以再寫入新的
                      資料到I2CDXR。這個中斷不適用於FIFO模式。
RRDYINT:用來通知CPU,I2CDRR接收到新的資料,CPU可以來讀取。這個中
                      斷不適用於FIFO模式。
ARDYINT:當I2C Port做為Master,ARDYINT用來通知CPU,前一段I2C命令已
                      終止,可以再寫入新的命令到I2C module register。
NACKINT:當I2C Port做為Master,在傳送資料給接收端,接收端要在ACK/NACK
                       bit將SDA訊號下拉,來表示ACK,有接收到資料。如果接收端沒反
                       應ACK,NACKINT就會被SET,通知CPU,接收端沒接收到資料。
                   
ALINT:Arbitration-lost為仲裁丟失,當I2C BUS上有兩個或多個I2C Master,企圖
                去發送資料時,但I2C Bus上,只能有一個Master,所以需要去仲裁是那個
                I2C Master搶到發言權。在TMS320F28335的I2C Master Port沒搶到發信權,
                ALINT就會被SET來通知CPU,並由I2C Master轉為Slaver。
SCDINT:在I2C傳送資料的最後,會有個Stop bit,讓I2C Bus上其他的I2C Module在
                   ,在偵測到這個stop事件,可以知道資料傳送結束,否則I2C Bus就是在
                   busy狀態。SCDINT用來通知CPU,有Stop condition被偵測到。
AASINT:當I2C Port做為Slave,在I2C Bus上接收到另一個I2C Master發送出來位址
                   資料是這個I2C Port所設定的Slave位址(I2COAR),也就是這個命令是要
                   傳給自已的 ,則ASSINT會被SET,通知CPU,要去接收後面由I2C Master
                   傳來的資料。
,



I2C相關暫存器




















I2COAR:設置在做為Slaver時的address位址。
I2CIER:用來設置那些中斷是有效的。
I2CSTR:用來判斷I2C的狀態,其中有些暫存器要寫入"1"來清除狀態旗標。
I2CCLKL/I2CCLKH:用來設置I2C Master clock的周期時間與頻率。
I2CCNT:用來設置I2C Master是要傳多少Byte或接收傳輸多少Byte的data。
I2CDRR:CPU讀取這個暫存器來接收另一端傳送來的資料。
I2CSAR:在做為I2C Master,設置I2CSAR來設定要操作的Slave address。
I2CMDR:控制I2C進入Start、Stop、Nack、Repeak、Reset等模式,在I2C
                   收發資料的過程中,需要去設定I2CMDR裡面的bits。
I2CISRC:CPU在收收到中斷通知後,會先讀取I2CISRC來得知是那個
                   中斷事件發生,再去執行對應的處理程序。讀完I2CISRC後,
                    在I2CSTR內的Flag會被清除,但I2CSTR的ARDY、RRDY、
                    XRDY是需要寫入"1"去清除的。
I2CDXR:CPU寫入資料到這個暫存器,來傳送資料給另一端。
I2CEMDR:設置BCM (Backwards compatibility mode),在做為Slave端
                      並在發送資料時,BCM設置為"0" or "1"會影響I2CSTR
                      暫存器裡XRDY, XSMT的動作方式。
I2CPSC:設置I2C input clock的除頻多少來轉為I2C module clock。
I2CFFTX/I2CFFRX:在FIFO模式下,TX與RX的控制與狀態暫存器。




void I2CA_Init(void)
{
   // Initialize I2C
   I2caRegs.I2CMDR.all = 0x0000; //將I2C模式設為Reset/Disable mode 
   I2caRegs.I2CFFTX.all = 0x0000; // 將FIFO模式關閉,Reset FFTX。。
   I2caRegs.I2CFFRX.all = 0x0040; // Reset FFRX, FFRX中斷功能關閉。
   #if (CPU_FRQ_150MHZ)             // 當CPU頻率(SYSCLKOUT)為150MHz,就設置
        I2caRegs.I2CPSC.all = 14;   // PSC為14,module clk (150/15 = 10MHz)
   #endif
   #if (CPU_FRQ_100MHZ)             //當CPU頻率(SYSCLKOUT)為150MHz,就設置
     I2caRegs.I2CPSC.all = 9;     //PSC為9,module clk (100/10 = 10MHz)
   #endif
   I2caRegs.I2CCLKL = 10;             // 注意:不能設為"0"
   I2caRegs.I2CCLKH = 5;              // 注意:不能設為"0"
   I2caRegs.I2CIER.all = 0x24;        // 啟動SCD與ARDY中斷的偵測
   I2caRegs.I2CMDR.all = 0x0020; // 設置I2C peripheral(裝置)離開Reset mode,
                                //可以接收Host在I2C Bus發送的命令。   
   I2caRegs.I2CFFTX.all = 0x6000;     // 啟動I2C FIFO模式與TX FIFO運作。
   I2caRegs.I2CFFRX.all = 0x2040;     // 動作 RXFIFO,清除RXFFINT旗標。
   return;

}




Reference:
1.TI TMS320x2833x, 2823x Inter-Integrated Circuit (I2C) Module Reference Guide (Rev. B)


















2019年9月24日 星期二

DSP TI TMS320F28335 GPIO設置


TI TMS320F28335 的GPIO,比較特別的是多了Qualification功能,另外可以用
GPxSET、GPxClear、GPxToggle來設置gpio輸出。下面是它的方塊圖與暫存器
例表與解釋。




































相關的暫存器如下






























GPACTRL:設定在Qualification(限定)功能的取樣周期。
GPAQSEL:設定在Qualification的取樣次數。
GPAMUX:設定各個GPIO pin是做為GPIO或是其它I/O pin功能,例如下面Table50裡
                     所定義的GPIO14與GPIO15 pin,除了可以被定義成"00"=>GPIO功能,各
                     別可以被定義為不同的I/O功能,如PWM、SCI、McBSP、eCAN等,但
                      每個GPIO可以被定義的I/O功能是不同的,需要在GPxMUX Table去確認                                     。
GPADIR:每個GPIO pin在做為GPIO功能時,可以各別定義是Input或Output pin,初始
                   設定是"0"=>Input。
GPAPUD:設置各個GPIO pin內部的Pullup電阻是否開啟,如下圖Table65,有些GPIO   
                    GPIO初始內部Pullup電阻是開啟的,有些GPIO是關閉的。雖然GPIO在系統
                    程式開始運作後,可以各別定義各個GPIO輸出,但在系統運作前,GPIO
                    是無法被程式所控制的。如果希這個GPIO與外部線路的節點在是拉High的
                    ,就可以找初始內部Pullup電阻是開啟的GPIO pin,或是直接在線路上,加
                    一個上拉電阻。
GPIOXINT1SEL:XINT是外部中斷,GPIOXINT1SEL可以設置GPIO0~31,其中的那一
                               PIN做為XINT1功能。
GPIONMISEL:XNMI是外部不可遮罩式中斷,可以設置GPIO0~31其中一PIN為NMI。
GPIOLPMSEL:一般外部中斷是無法在Low power mode(Halt, Standby mode)來喚醒系統
                             的,但GPIOLPMSEL可設置GPIO0~31其中一個,在Low power mode可以
                             用來外部觸發,喚醒系統回到工作模式。
GPADAT:這個暫存器有bit0~31,對映GPIO0~31。讀取這個暫存器可以知道GPIO0~31
                    PIN的輸入狀態是"0"還是"1",無論這個PIN在GPAMUX是被設為GPIO還是
                    其他的I/O功能。寫入這個暫存器可以設置GPIO0~31的輸出為"1"或是
                     "1"。
GPASET:這個暫存器有bit0~31,對映GPIO0~31對其中一個bit設為"1"就可以將它對映
                   的GPIO設為輸出High,但它要是在GPIO Output模式。對GPASET其它的bit寫
                   入"0",不會有任何影響,。
GPACLEAR:這個暫存器有bit0~31,對映GPIO0~31。對其中一個bit設為"1"就可以將它對映
                         的GPIO設為輸出Low,但它要是在GPIO Output模式。對GPACLEAR其它的bit
                         寫入"0",不會有任何影響。
GPATOGGLE:這個暫存器有bit0~31,對映GPIO0~31。對其中一個bit設為"1"就可以將它對映
                         的GPIO設為輸出反轉,但它要是在GPIO Output模式。例如讓原本輸出為High
                         轉為輸出Low。對GPATOGGLE其它的bit寫入"0",不會有任何影響。










GPIO輸入限定功能(Input Qualication)
GPIO在做為輸入時,可以開啟限定功能,在連續取樣3次或6次的High或Low,才
判斷輸入準位。例如要開啟GPIO3的限定功能就將GPIO Port A(GPIO0~31) GPAQSEL1的
Bit7:6設為"01"=>Qualification using 3 samples或"10"=>Qualification using 6 samples.

取樣時間間隔由GPACTRL的Bit0~7來設定,從1xTSYSCLKOUT 到510x TSYSCLKOUT
TSYSCLKOUT是SYSCLKOUT的倒數,SYSCLKOUT為150MHz,TSYSCLKOUT則為6.67ns
。GPIO3屬於GPIO0~7,由QUALPRD0來設定,如下圖的例子,在設定GPAQSEL1
為"1,0",設QUALPRD0為"01",可以得到取樣窗口為Tw(IQSW)=5x2xTSYSCLKOUT 。
6次取樣,只有5次取樣間隔,所以取樣窗口為5x2xTSYSCLKOUT=67ns。當出現(A)這個
脈衝時,會被限定器Qualifier給忽略到,直到後面連續取樣到6次"1",限定器的輸出
才會被拉到"1"。

在GPAQSEL1的設定,還有"00"=>與SYSCLKOUT同步、"11"=>非同步模式。
在"00"這個設定,取樣就只需要1次TSYSCLKOUT的時間。在"11"這個設定,GPIO做為
SCI、SPI、eCAN、I2C或是ePWM輸入訊號,它的取樣時間會是一次取樣時間加上
TSYSCLKOUT,所以當QUALPRDx設為"01",限定器響應輸入訊號的時間為2xTSYSCLKOUT
+TSYSCLKOUT














Reference:
1.TI TMS320x2833x, 2823x System Control and Interrupts Reference Guide (Rev. D)











2019年9月3日 星期二

DSP TI TMS320F28335 最簡單ADC功能設置


TI TMS320F28335的ADC要如何設置,下面有一個簡單的範例幫助大家
了解,請參考下面說明。

 TMS320F28335有一個12 bit ADC,有兩路的S/H(取樣保持),有16個取樣
通道。這樣可以用一個ADC取樣到16個訊號,這16個訊號源為ADCINA0
~ADCINA7與ADCINB0~ADCINB7,配合Sequencer(排序器),將這16個訊
號源排序,經過MUX開關切換,讓訊號源依序進到ADC進行轉換。





























Cascaded mode(串聯模式)
在Autosequencer(自動排序),去設定CONV00~CONV15各別是對應那個
ADCINXX,等到開始進行轉換,就會從CONV00對應的ADCINXX開始
進行,依序到CONV15。



ADC設定流程
1.對ADC設定參數
#先設定HSPCLK,HSPCLK = SYSCLKOUT/2*ADC_MODCLK2
   在下面的程式範例初始SYSCLKOUT為150MHz,設定MODCLK2為"5",
   可以得到HSPCLK=150/(2*5)=15MHZ
#再來設定ADC模組的Clock,ADC module clock = HSPCLK/ADC_CKPS,
   在設定ADC_CLKPS=1,ADC clock=15MHz/(2*1) = 7.5MHz
#設定取樣維持時脈(SHCLK),ACQP_PS=SHCLK+1,設定SHCLK=15,
  表示ACQ_PS=16個ADC Clock

2.寫入暫存器
#因為System clock的設定暫存器是受保護的,要修改暫存器去設定HSPCLK
  前,需要加EALLOW來解除保護,更改完後,再寫EDIS來恢復保護。
  HSPCLK修改=>  SysCtrlRegs.HISPCP.all = ADC_MODCLK;
#寫入ADC暫存器,如前面描述的,設定ADC_SHCLK與ADC_CKPS,得到
  ADC clock為7.5MHz,取樣時脈為15個ADC Clock。
     AdcRegs.ADCTRL1.bit.ACQ_PS = ADC_SHCLK;
     AdcRegs.ADCTRL3.bit.ADCCLKPS = ADC_CKPS
  設置ADC運作模式,如下面程式範例,設定SEQ_CASC=1,將ADCINA0~
   ADCINA7與ADCINB0~ADCINB7,16個訊號源串接。在這個實驗,只用
   一個訊號源,所以設定SEQ1.bit.CONV00為ADCINA0,
     AdcRegs.ADCTRL1.bit.SEQ_CASC = 1;       
     AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0;  
   設置CONT_RUN,表示為連續模式,當Autosequence裡的訊號源都完成ADC
   轉換後,Autosequence的指標就會直接回到第一筆訊號源,等待觸發,在觸
   發後,從第一筆訊號源依序進行ADC轉換。但如果CONT_RUN為"0",在
   Autosequence依序執行ADC轉換,指標會停在最後一筆訊號源,要設置
   AD_CTRL2->RST_SEQx,才能讓Sequence序列回到第一筆。
   AdcRegs.ADCTRL1.bit.CONT_RUN = 1;     
#要觸發ADC轉換,如下方表格ADCTRL2->SOC_SEQ1裡所示,有SW、ePWM
  、EXT3種方式。SW就如下面這個命令,由軟體直接設置ADCTRL2裡第13個bit
   SOC_SEQ1, 就會依序將Sequence1內設定的訊號源進行ADC轉換。
   AdcRegs.ADCTRL2.all = 0x2000;
 
3.讀出ADC轉換結果:
   當ADC進行轉換,就要等待它轉換結束,將數值讀出來。所以會用While迴圈
   ,當Sequence1內的訊號完成ADC轉換,ADCST狀態暫存器裡的INT_SEQ1被設
   為"1",再來將這個中斷Flag清除後,就可以將ADC轉換的資料,讀出來。在這
   個例子,由於只用到CONV00, 所以只有一個ADCINA信琥源的數據,被存在
ADCRESULT0,
   while (AdcRegs.ADCST.bit.INT_SEQ1== 0) {} 
   AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;
   showdata=AdcRegs.ADCRESULT0;


程式範例
void delay_loop(void);
#define ADC_MODCLK 0x5                                                    
#define ADC_CKPS   0x1     
#define ADC_SHCLK  0xf   
Uint16 showdata;

int main(void)
{
     InitSysCtrl();
     EALLOW;
     SysCtrlRegs.HISPCP.all = ADC_MODCLK;
     EDIS;
     DINT;
     InitPieCtrl();
     IER = 0x0000;     
     IFR = 0x0000;
      InitPieVectTable();
      InitAdc();  // For this example, init the ADC
       // Specific ADC setup for this example:
          AdcRegs.ADCTRL1.bit.ACQ_PS = ADC_SHCLK;
          AdcRegs.ADCTRL3.bit.ADCCLKPS = ADC_CKPS;
          AdcRegs.ADCTRL1.bit.SEQ_CASC = 1;        // 1
          AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0;  
          AdcRegs.ADCTRL1.bit.CONT_RUN = 1;       
          AdcRegs.ADCTRL2.all = 0x2000;

          for(;;)
          {
          while (AdcRegs.ADCST.bit.INT_SEQ1== 0) {} // 等待中断
          AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;
          showdata=AdcRegs.ADCRESULT0;
          delay_loop();
          }
}

void delay_loop()
{
    long      i;
    for (i = 0; i < 4500000; i++) {}
}



















Reference:
1.http://www.ti.com/general/docs/litabsmultiplefilelist.tsp?literatureNumber=spru812a
    => TMS320x2833x, 2823x Analog-to-Digital Converter (ADC) Module Reference Guide (Rev. A)






2019年5月1日 星期三

1-Wire SDQ Interface and Protocol


1-Wire SDQ介面,是一個只靠一條信號與GND就可以進行溝通的通訊介面。常
用電池、電源辨識、資料加密等,資料量小、低速傳輸的應用。在下面我就用
TI BQ2022A的dasheet裡,CPU(HOST)I如何來讀取BQ2022A內部的資料來做例
子,從硬體到協議溝通層面來解釋。

1.硬體層面

在硬體方面,BQ2022A做為Slave,接收CPU/MCU的命令,兩邊的SDQ與GND
相接,而因為兩邊都是Open drain的方式在控制SDQ信號,需要在SDQ信號線上
,加入上拉電阻到VPU電源,VPU電源為2.65~5.5V。





















下圖是BQ2022Q功能方塊。裡面包括SDQ通訊控制器與8 bit CRC產生,右邊
則是3種ROM,分別存放ID、資料、狀態。當CPU透過SDQ信號線要來讀取
BQ2022A裡面的ROM,需要透過SDQ通訊命令,並且會加上CRC數據,讓
CPU確認它收到的資料是否有錯。
















2.協議溝通Protocol層面

SDQ通訊命令如下,分成Level I與Level II,Level I為分為Read serialization
ROM (33h)與Skip Serialization ROM(CCh),差別在於要從ID ROM開始讀/寫
或是Skip跳到Memory ROM來讀寫。ID ROM是8 bit family code + 48 bit
identification number + 8 bit CRC。

Level II的命令用來讀寫Memory 與Status ROM的資料,Read Memory/Field
CRC(F0h)與Read Memory/Page CRC的差別在於前者是CPU讀到Memory
1024bit 的結尾,BQ2022A才送出CRC資料,後者是將1024bit分成4個Page
,各別256bit,每讀到一個Page結尾,BQ2022A就送出CRC資料。



















執行Read serialization ROM (33h)後,可以讀到7+1 byte的ID ROM,再進到
LevelII,來操作Memory ROM







執行Skip ROM (CCh)後,就會跳過ID ROM,直接進到LevelII,來操作
Memory ROM
下圖是一個Read Memory/Field CRC的命令序列,第一步是進行Level I的
命令,第二步CPU發送Read Memory Command(F0h),第三、四步是
Address命令,來決定要從1024bit裡的那個位置開始讀取。例如要從
Address 0006h來讀,那就要先傳送Low byte 06h,再傳High byte 00h。
CPU再發送出Command與Address後,下一步就要從BQ2022A去讀到
CRC值,這個CRC值是BQ2022A計算它接收到的Command與Address,
也就是F0h,06h,00h後產生的。CPU自已也會去計算Command(F0h)與
Address(0006h)的CRC值,去跟從BQ2022A讀到的CRC值來比較,如果
一樣,表示BQ2022A有正確接收到CPU所送出的命令,如果不一樣,表
示BQ2022A接收有錯誤,就要重新Reset再送一次命令。


在第5個步驟Read and Verify CRC通過後,CPU就開始去讀Memory的
資料,BQ2022A傳送資料的起始位址,就是從Address命令決定。一
直到CPU讀到1024bit的結尾,BQ2022A會再送出一個CRC,也就是
前面所傳送Memory資料的CRC值,CPU也會計算它從BQ2022A讀到
的Memroy資料的CRC值,兩個值去比對,就可以確保CPU讀到的資
料是正確的,避免在傳送資料的過程中,SDQ訊號受到干擾,導致
CPU判讀某個bit出錯。


3.物理層Physical層面

Reset timing
當CPU要開始對BQ2022A進行控制前,需要在SDQ信號線上,CPU
與BQ2022進行確認的動作,CPU將SDQ拉low至少480us,這就是
Reset timing。而BQ2022A接收到Reset後,也要拉low在60~240us
,這就是Presence Pulse命令。CPU接收到Presence Pluse後,才
會進行後面讀寫ROM的動作。

Write bit
當CPU在對BQ2022A發送命令時,就是寫入的動作,而每一個bit就
如下圖,CPU先拉low,持續tWSTRB的時間,這個時間可以是1~15us。
再來CPU就要去拉high或low直到tWDH的時間到達。tWDH的時間至少
要60us,最大就是一個bit cycle時間,bit cycle就是一個bit的周期,從
CPU拉low到下一次CPU拉low的時間間隔。當CPU在進行Write bit,
BQ2022A就要在CPU拉low後15us~60us去辨別CPU是Write"1" 或Write
"0"。在tWDT後,會有一段High的時間trec,至少要1us。這樣BQ2022A
才能去偵測SDQ信號,判斷下一個bit cycle開始,











Read bit
當CPU在對BQ2022A讀取資料時,每一個bit就如下圖,CPU先拉low
,持續tRSTRB的時間,這個時間可以是1~13us,然後CPU會放開控制,
由BQ2022A來決定該bit是"0"還是"1"。直到tODHO時間到,BQ2022A
放開控制。Read bit的bit cycle與Write bit一樣,由CPU決定。在CPU
拉low,到它下一次拉low的時間。


下圖為時序表。
































市面上也有邏輯分析器可以直接將SDQ信號解碼,如前面說的,一個
完成的SDQ,一開始會有RESET->PRESENCE->Level I 的Skip 
Serialization ROM (0xCC) ->Level II的Read Memory/Page CRC->
Address Low byte->Address High byte->第一次CRC確認->Start Read
Memory ROM->End Page CRC ->Read Memory ROM of Next Page->
End Page CRC->Read Memory ROM of Final Page->End Page CRC。


























Reference
1.TI BQ2022A datasheet
http://www.ti.com/lit/ds/symlink/bq2022a.pdf
2.CRC計算網站
https://www.lammertbies.nl/comm/info/crc-calculation.html
3.孕龍邏輯分析儀
http://www.zeroplus.com.tw/logic-analyzer_tw/products.php?pdn=7&product_id=254


2019年1月23日 星期三

DSP TI TMS320F28335 PWM設置




Time Base(TB)時間基礎方塊

TBPRD:Time base period,也就是計數的周期是多少TBCLK。
TBCLK:Time base clock是由SYSCLKOUT prescale,做為TB的CLOCK,在
                 TBCTL.CLKDIV去設置。
TBCTR:Time base counter計數暫存器,可以向上也可以向下計數。
TBPHS:Time base phase相位暫存器,用來同步不同的ePWM模組。在觸發
                 ePWMxSYNCI事件,各個ePWM模組就將各自TBPHS裡的值載入到
                TBCTR。這個功能可以在TBCTL.PHSEN開啟或關閉。
TBCTL:Time base control 控制暫存器,用來設置TB裡的參數,如Clcok
                 prescale, 計數器是,向上計數/向下計數/向上向下計數方式,active
                與shadow模式的選擇。

在TBPRD、CMPA、CMPB有分成兩種模式,分別是active與shadow,在設置為
active mode的情況下,在更新TBPRD暫存器後,就會立即影響硬體,偵測到觸
發事件就會立即響應。在shadow mode則有緩衝,在更新TBPRD後,要等到
TBCTR為0,才會將TBPDR在shadown暫存器裡的值,更新到active暫存器,也
才會偵測硬體事件。這樣可以避免在軟體配置暫存器時,與硬體不同步而造成
系統崩潰或故障。






EPWMxSYNCI,同步信號脈衝,讓計數直接載入(跳到)TBPHS所設定的值。





Counter ccompare(CC)計數比較方塊

CMPA:Counter Compare A resigster計數比較暫存器A,在這個暫存器設定一個數
               值,與TBCTR的值做比較,用來設定PWM訊號的Duty。
CMPB:Counter Compare B resigster計數比較暫存器B
CMPCTL:Counter compare control計算比較的控制暫存器,裡面包括了CMPA/B要
                    被設為shadow或active模式。在shadow模式下,CMPA/B在更新後,是
                    要在CTR=PRD or CTR=0才去載入更新後的值。








Action Qualifier(AQ)動作限定方塊

AQCTLA:AQ控制暫器器A,在接收到TB送來的觸發信號CTR=PRT, CTR=ZERO,
與CC送來的觸發信號CTR=CMPA,CTR=CMPB,由這4個信號來控制EPPWMA的輸出。
設置AQCSFRC是在active模式還是shadow模式。
AQCTLB:AQ控制暫器器B
AQSFRC:AQ software force軟體強制暫存器,由軟體強制EPWM輸出為low/high/toggle
,toggle就是反轉,改變到相反準位。
AQCSFRC:AQ continute software force連續軟體強制





向上計數的範例,從AQCTLA/B去設置TBCTR=0,EPWMxA輸出high。TBCTR=CA,
EPWMxA輸出low。TBCTR=TBPRD,EPWMxA輸出high。




Dead-Bamd Generator(DB)死區方塊

DBCTL:Dead Band control死區控制暫存器,如下圖Figure31, BTCTL控制IN_MODE
POLSEL、OUT_MODE的開關。由IN_Mode
DBRED:Dead Band Rising Edge Delay死區上升邊緣暫存器
DBFED:Dead Band Falling Edge Delay死區下降邊緣暫存器







從上面的真值表來看,再對應Figure 32的波形,可以看出不同模式下EPWMxA與
EPWMxB的變化。DBCTL(IN_MODE)為"00",也就是從EPWMxA信號源來做為
EPWMxA與EPWMxB輸出。

Mode1:DBCTL(OUT_MODE)為00,表示Dead Band不動作。
Mode6:DBCTL(OUT_MODE)為01,作為FED,只有Falling Edge Delay方塊動作。
Mode7:DBCTL(OUT_MODE)為10,作為RED,只有Rising Edge Delay方塊動作。
Mode 2~5:DBCTL(OUT_MODE)為11,表示Rise edge與Falling edge delay方塊都
                    動作。EPWMxA的輸出經過上升延遲,EPWMxB的輸出經過下降延
                    遲delay。由DBCTL(OUT_POLSEL)來設置是否EPWMxA/B信號是否反
                    相。
Mode2:DBCTL(OUT_POLSEL)=10,EPWMxA/B互補,EPWMxB輸出反相, 與
               EPWMxA輸出相反。
Mode3:DBCTL(OUT_POLSEL)=01,EPWMxA/B互補,EPWMxA輸出反相, 與
               EPWMxB輸出相反。
Mode4:DBCTL(OUT_POLSEL)=00,EPWMxA/B信號同相。
Mode5:DBCTL(OUT_POLSEL)=11,EPWMxA/B信號都進行反相,所以兩個信
               號還是同相。



PWM-Chopper(PC)PWM斬波方塊

PWM斬波的功能如下
1.可由程式設置斬波頻率
2.可由程式設置第一個脈衝寬度
3.可由程式設置第2個脈衝以及後面脈衝的占空比(Duty cycle)
4.也可以旁路掉(Bypass)斬波功能

由於大多數功率器件如MOSFET,開通通電要比維持電流大得多,所以第一
個脈衝需要比較大的脈寬來導通MOSFET,後來的脈衝就可以用比較小的脈
寬來維持MOSFET的導通。

PCCTL:PWM Chopper control斬波控制暫存器
PCCTL[OSHTWTH]:設置第一個脈衝的脈寬。可設定1~16倍SYSCLKOUT/8
                                      的時間寬度。
PCCTL[CHPDUTY]:設置脈衝的占空比,從12.5%~87.5%
PCCTL[CHPFREQ]:除頻設置,從不除頻到8除頻。假設SYSCLKOUT為
                                    100MHz,在經過"/8"後,變成12.5MHz,再經過CHFREQ
                                    設置的除頻,"8除頻",PSCLK就為1.56MHz。
在第一次脈衝會由one-shot輸出,經由OSHT控制EPWM輸出,第一次脈衝後,
就由PSCLK來控制EPWM輸出。






Trip-Zone錯誤聯防方塊

Trip-Zone的功能如下
1.有輸入腳TZ1~TZ6對應到6組ePWM模組
2.在錯誤事件發生後,可以強制EPWMxA/B為高、低、高阻抗、無動作共4種
   動作。
3.在短路或過電流事件發生時,支援一次性錯誤聯防觸發(OSHT)。
4.在限流操作時,支援周期性錯誤聯防觸發(CBC)。
5.每個TZ腳位,都可以設置成OSHT或CBC,也都可以設置為中斷來源。
6.支援軟體強制錯誤聯防。也可以將錯誤聯防關閉。


TZSEL:TZ選置暫存器,個別設置TZ1~TZ6開啟或關閉錯誤聯防功能,並且為
                 一次性或周期性錯誤聯防,
TZCTL:TZ控制暫存器,設置錯誤聯防事件發生後,ePWMxA與ePWMxB各進
                 行這四個動作邏輯"高、低、高阻抗、無動作"的那一個。
TZINT:TZ中斷致能暫存器,設置一次性(OSHT)與周期性(CBC)事件發生後,
                 是否觸發EPWMx_TZINT中斷。
TZFLG:TZ中斷旗標暫存器,裡面的TZFLG.OST,TZFLG.CBC表示一次
                性(OSHT)與周期性(CBC)事件 是否 發生。當OST或CBC其中一個事件
                發生,並且PIE中斷也被致能,就會設置TZFLG.INT,表示
                 EPWMx_TZINT中斷。
TZCLR:當TZFLG裡的OSHT或CBC被設為"1"表示發生事件,就設置TZCLR裡
                 的OST與CBC為"1",來將TZFLG的旗標清除。當TZFLG.INT為"1",就
                 要設置TZCLR.INT來將TZFLG.INT清除為"0"。
TZFRC:錯誤聯防中斷強制暫存器,可以設置TZFRC.OST 或 TZFRC.CBC來強
                制TZFLG.OST與TZFLG.CBC為"1"。


一次性錯誤聯防發生後,需要軟體去將這個事件旗標(flag)清除,而周期性錯誤
聯防的事件旗標會自動被清除。








Reference