MAX20340簡化了通過電源線發(fā)送和接收數(shù)據(jù)的過程。任何具有 I 的系統(tǒng)2C主站可以在供電的同時發(fā)送和接收數(shù)據(jù)。本文討論如何編寫軟件以在主站和從站之間發(fā)送和接收數(shù)據(jù)。它還提供了示例代碼片段以加速開發(fā)。
介紹
本文說明如何使用MAX20340雙向直流電力線通信管理IC發(fā)送和接收數(shù)據(jù)。該文件描述了用于將數(shù)據(jù)傳輸?shù)絾蝹€從站或多個從站的主從固件。還包括示例代碼片段。
通信概述
在最簡單的配置中,主機(jī)僅通過兩個物理觸點連接到單個從站:PLC和接地。主機(jī)和從機(jī)各有自己的微控制器,通過I與各自的MAX20340通信。2C 發(fā)送和接收數(shù)據(jù)。
圖1.主站和單個從站之間通信接口的簡化框圖。
傳輸數(shù)據(jù)
MAX20340簡化了電力線數(shù)據(jù)傳輸。首先,要傳輸?shù)臄?shù)據(jù)是通過I寫入的2C 到三個 8 位傳輸數(shù)據(jù)字節(jié)寄存器。然后,PLC傳輸位通過I2C 指定要傳輸?shù)淖止?jié)數(shù)。一旦寫入 PLC 傳輸位,傳輸就開始了。
最多寫入三個字節(jié)的數(shù)據(jù)以傳輸?shù)絺鬏敂?shù)據(jù)字節(jié)寄存器(TX_DATA0、TX_DATA1和寄存器TX_DATA2 0x0D、0x0E、0x0F)。
將 PLC 傳輸位 (TX[1:0]) 寫入PLC_COM_CTRL寄存器以觸發(fā)最多三個字節(jié)的傳輸。寫入 TX[1:0] 字段的值指定要傳輸?shù)淖止?jié)數(shù)。(PLC_COM_CTRL在登記冊0x09中)。
圖2.流程圖顯示了使用MAX20340通過電源線傳輸數(shù)據(jù)的步驟。
接收數(shù)據(jù)
接收從另一個MAX20340發(fā)送的數(shù)據(jù)也非常簡單。斷言“新數(shù)據(jù)”中斷,指定接收數(shù)據(jù)時的字節(jié)數(shù)。然后,可以通過I2C在三個8位接收數(shù)據(jù)字節(jié)寄存器中讀取接收的數(shù)據(jù)。
等待新數(shù)據(jù)中斷(NEW_DATA1i并在寄存器2x0B中NEW_DATA0i)。
從接收數(shù)據(jù)字節(jié)寄存器(寄存器0x1、2x0 和 10x0)中讀取最多三個字節(jié)的接收數(shù)據(jù)(RX_DATA11、RX_DATA0 和寄存器中的RX_DATA12)。
圖3.流程圖顯示了使用MAX20340通過電源線接收傳輸數(shù)據(jù)的步驟。
主/從通信流程
在典型應(yīng)用中,主從應(yīng)用處理器遵循主/從通信順序并檢查傳輸錯誤。
MAX20340配置為主站,啟動所有PLC通信。配置為從機(jī)的MAX20340只能在主站向其發(fā)送數(shù)據(jù)后向主站發(fā)送數(shù)據(jù)。主站傳輸數(shù)據(jù)后,啟動定時器等待從站響應(yīng)。如果計時器過期,則在主站上斷言PLC_TMRi中斷,表示從機(jī)沒有響應(yīng)。在發(fā)送任何新數(shù)據(jù)之前,主站應(yīng)等待從站響應(yīng)或超時。
主機(jī)和從站還應(yīng)檢查PLC_TX_ERRi和PLC_RX_ERRi中斷指定的傳輸錯誤。
例子
這些實現(xiàn)示例假設(shè)主從應(yīng)用處理器的輸入引腳配置為中斷,連接到MAX20340的中斷引腳。調(diào)用“wait_for_interrupt()”會檢查此引腳的狀態(tài)并等待其為低電平。此功能的實現(xiàn)是特定于平臺的。調(diào)用“I2C_write_register(...)”和“I2C_read_register(...)”可啟動MAX8中20340位寄存器的讀寫,其實現(xiàn)也特定于平臺。
假設(shè)在每個示例中都已取消屏蔽所有相關(guān)中斷。其他一些實現(xiàn)通過 I 輪詢中斷寄存器2C 而不是取消屏蔽中斷并使用中斷引腳。
這些示例假設(shè)所有傳輸均以默認(rèn)通信設(shè)置發(fā)送:24μs通信頻率、288mA PLC灌電流、奇偶校驗和10ms RX等待定時器。這些設(shè)置取決于應(yīng)用程序。
將數(shù)據(jù)傳輸?shù)絾蝹€從站
在本例中,PLC 主站連接到單個 PLC 從站(圖 1)。主站傳輸三個字節(jié),從站以一個字節(jié)響應(yīng)。主機(jī)應(yīng)僅在處于“從站發(fā)現(xiàn)充電”狀態(tài)(FSM_STAT = 0b110)時嘗試傳輸數(shù)據(jù)。
主傳輸
主固件遵循以下基本結(jié)構(gòu),在設(shè)置中斷掩碼后傳輸三個字節(jié):
將一組三個字節(jié)加載到 TX_DATA0-2 寄存器中。
通過在PLC_COM_CTRL寄存器中寫入 TX[1:0] 位來發(fā)送三個字節(jié)。
(可選)等待 NEWDATA1/2、TMR_ERR、TX_ERR 或 RX_ERR 中斷。
或者,如果收到 NEWDATA1/2 中斷,則從RX_DATA寄存器讀取從屬響應(yīng)。
從屬接收
設(shè)置中斷掩碼后,從屬固件遵循以下基本結(jié)構(gòu),等待來自主站的數(shù)據(jù),并可選擇在主站的等待計時器到期之前做出響應(yīng):
等待 RX_ERR 或 NEW_DATA1/2 中斷。
如果收到 NEWDATA1/2 中斷,則從 RX_DATA0-2 個寄存器讀取數(shù)據(jù)字節(jié)。
(可選)將響應(yīng)加載到 TXDATA0 寄存器中。
(可選)通過在PLC_COM_CTRL寄存器中寫入 TX[1:0] 位來發(fā)送一個字節(jié)。
主傳輸固件示例代碼片段
主固件的代碼片段如下所示。在此示例中,數(shù)據(jù)字節(jié)、0x55、0x5A和0xA5由主站傳輸。此代碼旨在用作輔助開發(fā)的參考,不能按原樣使用。
/*Load a set of three bytes into TX_DATA0-2 registers and write all three bytes at once (I2C auto-incrementation of register address)*/ uint8_t data_bytes[3]; data_bytes[0] = 0x55; data_bytes[1] = 0x5A; data_bytes[2] = 0xA5; I2C_write_register(AO23_MAST_ADDR, TX_DATA0_REG, data_bytes, 3); /*Send three bytes by writing 0b11 to the TX[1:0] bits in the PLC_COM_CTRL register (all other bits [7:2] are application dependent)*/ I2C_write_register(AO23_MAST_ADDR, PLC_COM_CTRL_REG, 0x97); /*Optional: wait for NEWDATA, TMR_ERR, TX_ERR, or RX_ERR interrupt (timeout should be added in typical system)*/ wait_for_interrupt(); /*Optional: Check if interrupt was caused by slave response (NEWDATA1/2)*/ uint8_t plc_int_buf[1]; I2C_read_register(AO23_MAST_ADDR, PLC_IRQ_REG, plc_int_buf, 1); bool new_data = (plc_int_buf[0] & 0x06) != 0; /*Optional: If NEWDATA interrupt, read single-byte slave response (response should be processed in typical system)*/ if(new_data){ uint8_t slave_resp_buf[1]; I2C_read_register(AO23_MAST_ADDR, RX_DATA0_REG, slave_resp_buf, 1); }
從站接收固件示例代碼片段
A snippet from the slave firmware is shown below. The slave responds to the received data by transmitting a single byte: 0x55 in this example. This code is meant to be used as a reference to assist development and cannot be used as is./*Wait for RX_ERR or NEW_DATA1/2 interrupt*/ wait_for_interrupt(); /*Check if interrupt caused by received data (NEWDATA1/2)*/ uint8_t plc_int_buf[1]; I2C_read_register(AO23_SLAV_ADDR, PLC_IRQ_REG, plc_int_buf, 1); bool new_data = (plc_int_buf[0] & 0x06) != 0; /*If data received, read data and optionally respond*/ if(new_data){ /*Read all three data bytes from RX_DATA0-2 registers (I2C auto-incrementation of register address) (received data should be processed in typical system)*/ uint8_t data_reg_buf[3]; I2C_read_register(AO23_SLAV_ADDR, RX_DATA0_REG, data_reg_buf, 3); /*Optional: Load response into TXDATA0 register*/ I2C_write_register(AO23_SLAV_ADDR, TX_DATA0_REG, 0x55); /*Optional: Send one byte by writing the TX[1:0] bits in the PLC_COM_CTRL register (all other bits [7:2] are application dependent)*/ I2C_write_register(AO23_SLAV_ADDR, PLC_COM_CTRL_REG, 0x95); }
將數(shù)據(jù)傳輸?shù)絻蓚€從站
在本例中,主機(jī)向兩個連接的從站之一傳輸三個字節(jié)(圖 4)。
圖4.主站和兩個從站之間通信接口的簡化框圖。
每個從機(jī)都配置了不同的RSEL電阻值,以確保它們具有唯一的PLC從機(jī)地址。目標(biāo)接收方的 PLC 從地址被添加到第一個傳輸字節(jié)的 MSB 中。
從站以一個字節(jié)響應(yīng),并在響應(yīng)字節(jié)的MSB中包含自己的PLC從地址。
有關(guān)本實現(xiàn)示例中使用的PLC從站尋址的更多詳細(xì)信息,請參閱本文檔的“多個從站注意事項”部分。
主傳輸
主固件遵循以下基本結(jié)構(gòu),在設(shè)置主等待計時器和中斷掩碼后傳輸三個字節(jié):
將一組三個字節(jié)加載到 TX_DATA0-2 寄存器中(23 位中只有 24 位包含要發(fā)送的數(shù)據(jù))。一位,即TX_DATA0的MSB,包含接收方的PLC從地址)。
通過在PLC_COM_CTRL寄存器中寫入 TX[1:0] 位來發(fā)送三個字節(jié)。
(可選)等待 NEWDATA1/2、TMR_ERR、TX_ERR 或 RX_ERR 中斷。
或者,如果收到 NEWDATA1/2 中斷,則從RX_DATA寄存器讀取從屬響應(yīng)。
從屬接收
設(shè)置中斷掩碼后,從屬固件遵循以下基本結(jié)構(gòu),等待來自主站的數(shù)據(jù),并可選擇在主站的等待計時器到期之前做出響應(yīng):
等待 RX_ERR 或 NEW_DATA1/2 中斷。
如果收到 NEWDATA1/2 中斷,則從 RX_DATA0-2 寄存器讀取數(shù)據(jù)字節(jié)。
讀取DEV_STATUS1寄存器的PS_ADD位。
檢查RX_DATA0的 MSB。如果 MSB 不等于 PS_ADD,請忽略接收到的數(shù)據(jù)。
(可選)將響應(yīng)加載到 TXDATA0 寄存器中(7 位中只有 8 位包含要發(fā)送的數(shù)據(jù))。一位,即 TX_DATA0 的 MSB,包含 PS_ADD 位)。
(可選)通過在PLC_COM_CTRL寄存器中寫入 TX[1:0] 位來發(fā)送一個字節(jié)。
主傳輸固件示例代碼片段
主固件的代碼片段如下所示。在此示例中,數(shù)據(jù)字節(jié)0x55、0x5A和0xA5由主站傳輸。數(shù)據(jù)以PLC從站地址“1”傳輸?shù)綇恼?。因此,發(fā)送的實際數(shù)據(jù)是0xD5、0x5A和0xA5(PLC 從地址添加到字節(jié) 1 的 MSB 中)。此代碼旨在用作輔助開發(fā)的參考,不能按原樣使用。
/*Load a set of three bytes into TX_DATA0-2 registers and write all three bytes at once (I2C auto-incrementation of register address)*/ uint8_t data_bytes[3]; data_bytes[0] = 0xD5; /*This byte contains 7 bits of actual data, MSB is recipient PS_ADD*/ data_bytes[1] = 0x5A; data_bytes[2] = 0xA5; I2C_write_register(AO23_MAST_ADDR, TX_DATA0_REG, data_bytes, 3); /*Send three bytes by writing 0b11 to the TX[1:0] bits in the PLC_COM_CTRL register (all other bits [7:2] are application dependent)*/ I2C_write_register(AO23_MAST_ADDR, PLC_COM_CTRL_REG, 0x97); /*Optional: Wait for slave response interrupt (timeout should be added in typical system)*/ wait_for_interrupt(); /*Optional: Check if interrupt caused by slave response (NEWDATA1/2)*/ uint8_t plc_int_buf[1]; I2C_read_register(AO23_MAST_ADDR, PLC_IRQ_REG, plc_int_buf, 1); bool new_data = (plc_int_buf[0] & 0x06) != 0; /*Optional: if NEWDATA interrupt, read slave response (response should be processed in typical system)*/ if(new_data){ uint8_t slave_resp_buf[1]; I2C_read_register(AO23_MAST_ADDR, RX_DATA0_REG, slave_resp_buf, 1); }
從站接收固件示例代碼片段
從固件的代碼片段如下所示。從站通過發(fā)送單個字節(jié)來響應(yīng)接收到的數(shù)據(jù):在本例中0x55。該從站的PLC從站地址為“1”。因此,發(fā)送的實際數(shù)據(jù)是0xD5(PLC從地址被添加到字節(jié)1的MSB)。此代碼旨在用作輔助開發(fā)的參考,不能按原樣使用。
/*Wait for RX_ERR or NEW_DATA1/2 interrupt*/ wait_for_interrupt(); /*Check if interrupt caused by received data (NEWDATA1/2)*/ uint8_t plc_int_buf[1]; I2C_read_register(AO23_SLAV_ADDR, PLC_IRQ_REG, plc_int_buf, 1); bool new_data = (plc_int_buf[0] & 0x06) != 0; /*If data received, read data, check if intended recipient, and optionally respond*/ if(new_data){ /*Read all three data bytes from RX_DATA0-2 registers (I2C auto-incrementation of register address) (received data should be processed in typical system)*/ uint8_t data_reg_buf[3]; I2C_read_register(AO23_SLAV_ADDR, RX_DATA0_REG, data_reg_buf, 3); /*read PS_ADD bit of the DEV_STATUS1 register*/ uint8_t slave_addr_buf[1]; I2C_read_register(AO23_SLAV_ADDR, DEV_STATUS1_REG, slave_addr_buf, 1); uint8_t PS_ADD = slave_addr_buf[0] & 0x01; /*Check if MSB of RX_DATA0 (intended recipient address) equals PS_ADD of this slave*/ uint8_t = recipient_plc_addr = (data_reg_buf[0] & 0x80) >> 7; bool is_recipient = (PS_ADD == recipient_plc_addr); if(is_recipient){ /*Optional: Load response into TXDATA0 register. This byte contains 7 bits of actual data, MSB is the slave's own PS_ADD*/ I2C_write_register(AO23_SLAV_ADDR, TX_DATA0_REG, 0xD5); /*Optional: Send one byte by writing the TX[1:0] bits in the PLC_COM_CTRL register (all other bits [7:2] are application dependent)*/ I2C_write_register(AO23_SLAV_ADDR, PLC_COM_CTRL_REG, 0x95); } }
多個從站注意事項
MAX20340主機(jī)可以連接任意數(shù)量的從機(jī)。PLC上的最大從站數(shù)量僅受主站可以提供的最大充電電流(1.2A)和PLC上的總電容的限制。
應(yīng)使用用戶定義的尋址方案,以防止當(dāng)PLC主站與兩個或多個PLC從機(jī)接口時,多個從站嘗試同時響應(yīng)。PLC從地址在傳輸過程中不會自動使用,盡管RSEL電阻可用于為從機(jī)分配具有唯一PLC從地址的從機(jī)。
當(dāng)主站傳輸數(shù)據(jù)時,所有連接的從站都會接收數(shù)據(jù),無論其配置的PLC從站地址如何。當(dāng) PLC 主站打算僅將數(shù)據(jù)包發(fā)送到其中一個 PLC 從站時,應(yīng)在數(shù)據(jù)字節(jié)中嵌入唯一標(biāo)識預(yù)期接收方的地址。用戶可以靈活地將地址分配給任何數(shù)據(jù)字節(jié)位。
RSEL 設(shè)置的 PLC 從地址僅為 1 位。因此,它僅在尋址最多兩個從站時才有用。如果連接了兩個以上的PLC從站,則必須使用更多位傳輸?shù)臄?shù)據(jù)字節(jié)來唯一地尋址所有從站。
所有PLC從站接收相同的數(shù)據(jù)。因此,每個從站的應(yīng)用處理器都應(yīng)該從傳輸?shù)臄?shù)據(jù)中提取地址位,并將其與自己的唯一地址進(jìn)行比較,以確定它是否是預(yù)期的接收者。然后,預(yù)期的從站相應(yīng)地處理數(shù)據(jù),而其他從站則簡單地丟棄數(shù)據(jù)。
雙從機(jī)尋址示例
假設(shè)有兩個連接的從站,第一個具有PLC從地址“0”,第二個具有PLC從地址“1”(基于RSEL值并存儲在DEV_STATUS1寄存器的PS_ADD位中)。用戶選擇將目標(biāo)接收方的PLC從地址編碼為第一個字節(jié)的最高有效位。
主機(jī)向第一個從站發(fā)送 23 位數(shù)據(jù),如下所示:
字節(jié) 1: '0xxxx' 字節(jié) 2: 'xxxx'
字節(jié) 3: 'xxxxxx'
其中x是23位數(shù)據(jù),字節(jié)1的MSB包含第一個從站的PLC從地址('0')。
主機(jī)向第二個從設(shè)備發(fā)送23位數(shù)據(jù),如下所示:
字節(jié) 1: '1xxxx' 字節(jié) 2: 'xxxx'
字節(jié) 3: 'xxxxxxx'
其中x是23位數(shù)據(jù),字節(jié)1的MSB包含第二個從站的PLC從地址(“1”)。
當(dāng)主站傳輸此數(shù)據(jù)時,兩個從站都將接收數(shù)據(jù)。
當(dāng)從站接收數(shù)據(jù)時,如果字節(jié)1的MSB與配置的PLC從地址匹配,則此數(shù)據(jù)適用于它,并且應(yīng)該處理數(shù)據(jù)。 如果MSB與配置的PLC從地址不匹配,則此數(shù)據(jù)不適用于它,它應(yīng)該簡單地丟棄/忽略數(shù)據(jù)。
如果預(yù)期的接收者從站響應(yīng)主站,則所有其他從站也會收到響應(yīng)。在具有多個從站的從站響應(yīng)期間,預(yù)期的接收方從站自己的PLC從站地址應(yīng)嵌入到響應(yīng)的數(shù)據(jù)字節(jié)中。這可確保其他從站丟棄/忽略預(yù)期的從站對主站的響應(yīng)。
請注意,這不是必需的,PLC協(xié)議中沒有內(nèi)置從站尋址。如果用戶應(yīng)用程序不要求兩個從站接收不同的數(shù)據(jù),并且從屬機(jī)從不嘗試同時響應(yīng)主站,則唯一地址不需要嵌入到數(shù)據(jù)字節(jié)中。如果未使用從站尋址方案,則兩個從站都接收主站發(fā)送的數(shù)據(jù)。如果任何從站響應(yīng)主站,則所有其他從站將此響應(yīng)視為接收到的數(shù)據(jù)。如果兩個從站嘗試同時響應(yīng),則會發(fā)生通信錯誤。適當(dāng)?shù)膹恼緦ぶ贩桨缚梢苑乐勾祟愬e誤。
審核編輯:郭婷
-
電源
+關(guān)注
關(guān)注
184文章
17484瀏覽量
249155 -
寄存器
+關(guān)注
關(guān)注
31文章
5294瀏覽量
119816 -
plc
+關(guān)注
關(guān)注
5006文章
13107瀏覽量
461458
發(fā)布評論請先 登錄
相關(guān)推薦
評論