MAXQ3180微控制器為電表的多相模擬前端。它集成了現(xiàn)代多功能電能計(jì)量所需的所有功能。MAXQ3180通過(guò)串行外設(shè)接口(SPI?)總線將其讀數(shù)傳送給主機(jī)微控制器。本應(yīng)用筆記描述了該接口是如何完成的,并提供了示例代碼,以幫助設(shè)計(jì)人員實(shí)現(xiàn)通信機(jī)制。
SPI概述
串行外設(shè)接口 (SPI) 是一種設(shè)備間總線協(xié)議,可在芯片之間提供快速、同步、全雙工通信。一個(gè)器件(主設(shè)備)驅(qū)動(dòng)同步時(shí)鐘,并選擇多個(gè)從站中的哪一個(gè)被尋址。每個(gè)SPI外設(shè)由一個(gè)移位寄存器和控制電路組成,因此尋址串行外設(shè)接口SPI外設(shè)同時(shí)發(fā)送和接收。
圖1.SPI 從站的插圖。
SPI通信中使用了四種分立電路:
SCLK:所有設(shè)備使用的同步時(shí)鐘。主站驅(qū)動(dòng)此時(shí)鐘,從設(shè)備接收時(shí)鐘。請(qǐng)注意,SCLK 可以門(mén)控,不需要在 SPI 事務(wù)之間驅(qū)動(dòng)。
莫西:主人出來(lái),奴隸進(jìn)來(lái)。這是由主站驅(qū)動(dòng)到SPI總線上所有從機(jī)的主數(shù)據(jù)線。只有選定的從站時(shí)鐘從MOSI數(shù)據(jù)。
MISO:主人進(jìn),奴出。這是由選定的從站驅(qū)動(dòng)到主站的主數(shù)據(jù)線。只有選定的從機(jī)可以驅(qū)動(dòng)該電路。事實(shí)上,它是SPI總線布置中唯一允許從站驅(qū)動(dòng)的電路。
SSEL:此信號(hào)對(duì)于每個(gè)從站都是唯一的。當(dāng)活動(dòng)(通常為低電平)時(shí),所選從機(jī)必須驅(qū)動(dòng)MISO。
對(duì)于此討論,必須注意SPI外設(shè)同時(shí)發(fā)送和接收。想到這一點(diǎn)的一個(gè)方便方法是,主站總是發(fā)送一個(gè)字節(jié)并接收一個(gè)字節(jié)。
一些SPI外設(shè)犧牲了速度,轉(zhuǎn)而模擬半雙工操作。 MAXQ3180微控制器不是這種情況,它是一款真正的全雙工SPI從機(jī)。
本應(yīng)用筆記的其余部分介紹如何在SPI總線上連接并成功使用MAXQ3180。
MAXQ3180通信概述
對(duì)于主機(jī)(即主機(jī))來(lái)說(shuō),MAXQ3180看起來(lái)像一個(gè)由RAM和ROM組成的存儲(chǔ)器陣列。這是因?yàn)镸AXQ3180中的ROM固件從RAM讀取其工作參數(shù),并將結(jié)果放在RAM中。因此,配置MAXQ3180就像對(duì)其RAM位置進(jìn)行塊寫(xiě)入一樣簡(jiǎn)單。
一些MAXQ3180“存儲(chǔ)器”位置觸發(fā)器件內(nèi)的動(dòng)作,以“動(dòng)態(tài)”計(jì)算電能計(jì)量結(jié)果。寫(xiě)入這些位置是“nop”。RAM 和虛擬 ROM 位置的具體功能和用途超出了本文檔的范圍。這里重要的事實(shí)是,微控制器實(shí)際上只有兩種SPI通信操作:讀取和寫(xiě)入。
MAXQ3180中的每個(gè)事務(wù)都從主站發(fā)送兩個(gè)字節(jié)開(kāi)始,其中包含命令(即讀或?qū)懀⒃L問(wèn)地址和訪問(wèn)字節(jié)數(shù)。如上所述,每個(gè)SPI外設(shè)每接收一個(gè)字節(jié)返回一個(gè)字節(jié)。因此,MAXQ3180在接收到第一個(gè)命令字節(jié)后返回0xC1,在第二個(gè)命令字節(jié)后返回0xC2。該協(xié)議如圖 2 所示。
圖2.主機(jī)向MAXQ3180讀寫(xiě)數(shù)據(jù)。
如果主服務(wù)器正在讀取一個(gè)或多個(gè)字節(jié),則必須發(fā)送虛擬字節(jié)。請(qǐng)記住,除非從站發(fā)送一些東西,否則主站無(wú)法從從站接收任何東西:發(fā)送一個(gè)字節(jié)來(lái)獲取一個(gè)字節(jié)。但是在收到命令后,MAXQ3180可能必須計(jì)算結(jié)果,因此當(dāng)主機(jī)發(fā)送虛擬字節(jié)時(shí)可能還沒(méi)有準(zhǔn)備好結(jié)果。因此,MAXQ3180在發(fā)送數(shù)據(jù)之前,總是發(fā)送零個(gè)或多個(gè)NAK字符(0x4E或ASCII'N'),后跟ACK字符(0x41或ASCII'A')。
如果主站正在寫(xiě)入一個(gè)或多個(gè)字節(jié),它會(huì)在發(fā)送命令后立即發(fā)送要寫(xiě)入的數(shù)據(jù)。MAXQ3180為每個(gè)數(shù)據(jù)字節(jié)返回ACK (0x41)。然后,它返回 NAK (0x4E),直到寫(xiě)入周期完成,之后返回最終的 ACK。
注意,在最終ACK之后,MAXQ3180立即準(zhǔn)備好開(kāi)始下一筆交易;它不需要等待任何其他事件。甚至不需要切換 SSEL 即可開(kāi)始下一個(gè)事務(wù)。MAXQ3180知道第一筆交易已經(jīng)結(jié)束,并準(zhǔn)備好進(jìn)行下一筆交易。
無(wú)論出于何種原因,如果需要復(fù)位主機(jī)與MAXQ3180之間的通信(例如,如果通信變得不同步),主機(jī)只需等待200ms即可從第一個(gè)命令字節(jié)重新啟動(dòng)通信。200ms延遲通知MAXQ3180主機(jī)放棄前一個(gè)事務(wù)。
命令字節(jié)
命令字節(jié)告訴MAXQ3180:
請(qǐng)求的事務(wù)是讀取還是寫(xiě)入
交易的長(zhǎng)度
RAM 中要修改的地址(或要讀取的虛擬 ROM 地址)
圖3.命令字節(jié)的結(jié)構(gòu)。
第一個(gè)命令字節(jié)(圖3)告訴MAXQ3180所請(qǐng)求的事務(wù)是讀還是寫(xiě),以及事務(wù)的長(zhǎng)度。命令字節(jié)使用以下計(jì)劃:
長(zhǎng)度代碼 | 數(shù)據(jù)長(zhǎng)度 |
0b00 | 1 字節(jié) |
0b01 | 2 字節(jié) |
0b10 | 4 字節(jié) |
0b11 | 8 字節(jié) |
命令字節(jié) 1 的其余部分和所有命令字節(jié) 2 提供要訪問(wèn)的 RAM 中字節(jié)的地址(或虛擬 ROM 函數(shù)的身份)。
主機(jī)軟件設(shè)計(jì)
雖然MAXQ3180包含硬件SPI控制器,但單個(gè)消息字節(jié)仍由ROM固件中的軟件例程處理。因此,連續(xù)字節(jié)之間需要延遲。在當(dāng)前版本的MAXQ3180中,該延遲必須不小于100μs才能可靠工作。參見(jiàn)圖 4 和圖 5。
圖4.MAXQ3180讀數(shù)流程圖
圖5.編寫(xiě)MAXQ3180的流程圖
代碼清單
提供代碼,用于將內(nèi)置SPI主機(jī)的MAXQ2000微控制器連接至MAXQ3180。其他微控制器的用戶將需要提供自己的SPI基元,并可能修改高級(jí)子程序。
在下面的列表中,子例程導(dǎo)致程序線程在給定的微秒數(shù)內(nèi)停止執(zhí)行。常量被定義為提供比字符超時(shí)更長(zhǎng)的內(nèi)容。dly_usSPI_TIMEOUT
在高級(jí)子例程中,ENUM 用于按名稱(chēng)選擇寄存器。它索引數(shù)組,其中包括每個(gè)MAXQ3180寄存器的寄存器長(zhǎng)度。請(qǐng)參見(jiàn)圖 6、7 和 8。register_lookup_table
|
圖6.基元的代碼。Send_SPI
long Read_AFE(enum METER_REGISTER_RECORD reg, uint16 reg_addr) { extern unsigned char record[8]; unsigned long x = 0; unsigned char i, regadd, command_code = 0; for(i=0; i<8; i++) record[i] = 0; switch(register_lookup_table[reg].register_length) { case 2: command_code |= 0x10; break; case 4: command_code |= 0x20; break; case 8: command_code |= 0x30; break; } command_code |= reg_addr >> 8; regadd = reg_addr & 0xff; /* Disable SPI to reset it */ SPICN_bit.SPIEN = 0; for(x=0; x<300; x++); SPICN_bit.SPIEN = 1; SPI_SELECT_0; i = 0; while((Send_SPI(command_code)!= 0xC1)&&(++i < SPI_COMMAND_RETRIES)) spi_comm_timeout(); x = 0xffffffff; if (i == SPI_COMMAND_RETRIES) goto spierror; Send_SPI(regadd); i = 0; while((Send_SPI(0) != 'A') && (++i < SPI_RETRIES)); if (i == SPI_RETRIES) goto spierror; x = 0; for(i=0; i |
圖7.() 子例程的代碼。ReadAFESPI_Read
long Read_AFE(enum METER_REGISTER_RECORD reg, uint16 reg_addr) { extern unsigned char record[8]; unsigned long x = 0; unsigned char i, regadd, command_code = 0; for(i=0; i<8; i++) record[i] = 0; switch(register_lookup_table[reg].register_length) { case 2: command_code |= 0x10; break; case 4: command_code |= 0x20; break; case 8: command_code |= 0x30; break; } command_code |= reg_addr >> 8; regadd = reg_addr & 0xff; /* Disable SPI to reset it */ SPICN_bit.SPIEN = 0; for(x=0; x<300; x++); SPICN_bit.SPIEN = 1; SPI_SELECT_0; i = 0; while((Send_SPI(command_code)!= 0xC1)&&(++i < SPI_COMMAND_RETRIES)) spi_comm_timeout(); x = 0xffffffff; if (i == SPI_COMMAND_RETRIES) goto spierror; Send_SPI(regadd); i = 0; while((Send_SPI(0) != 'A') && (++i < SPI_RETRIES)); if (i == SPI_RETRIES) goto spierror; x = 0; for(i=0; i |
圖8.() 子例程的代碼。Write_AFESPI_Write
審核編輯:郭婷
-
微控制器
+關(guān)注
關(guān)注
48文章
7954瀏覽量
155190 -
芯片
+關(guān)注
關(guān)注
460文章
52520瀏覽量
441232 -
接口
+關(guān)注
關(guān)注
33文章
9005瀏覽量
153781
發(fā)布評(píng)論請(qǐng)先 登錄
16位微控制器MAXQ613電子資料
MAX3180/MAXQ3180中文資料pdf
MAXQ3180 Low-Power, Multifunct
如何使用MAXQ3180的低功耗測(cè)量模式與停止模式
怎樣使用MAXQ3180微控制器的串行外設(shè)接口(SPI)

Using the MAXQ3180 Analog Fron

在單相表架構(gòu)中使用模擬前端MAXQ3180

MAXQ3180 低功耗、多功能、多相AFE

MAXQ3180入門(mén):寄存器配置
基于MAXQ3180/MAXQ3183的電能表參考設(shè)計(jì)

MAXQ3180 MAXQ3183 AFE的電表參考設(shè)計(jì)

MAXQ615 16位MAXQ微控制器的硬件乘法器
在單相配置中使用MAXQ3180模擬前端

怎樣使用MAXQ3180微控制器的串行外設(shè)接口

評(píng)論