MAX20340簡化了通過電源線發送和接收數據的過程。任何具有 I 的系統2C主站可以在供電的同時發送和接收數據。本文討論如何編寫軟件以在主站和從站之間發送和接收數據。它還提供了示例代碼片段以加速開發。
介紹
本文說明如何使用MAX20340雙向直流電力線通信管理IC發送和接收數據。該文件描述了用于將數據傳輸到單個從站或多個從站的主從固件。還包括示例代碼片段。
通信概述
在最簡單的配置中,主機僅通過兩個物理觸點連接到單個從站:PLC和接地。主機和從機各有自己的微控制器,通過I與各自的MAX20340通信。2C 發送和接收數據。
圖1.主站和單個從站之間通信接口的簡化框圖。
傳輸數據
MAX20340簡化了電力線數據傳輸。首先,要傳輸的數據是通過I寫入的2C 到三個 8 位傳輸數據字節寄存器。然后,PLC傳輸位通過I2C 指定要傳輸的字節數。一旦寫入 PLC 傳輸位,傳輸就開始了。
最多寫入三個字節的數據以傳輸到傳輸數據字節寄存器(TX_DATA0、TX_DATA1和寄存器TX_DATA2 0x0D、0x0E、0x0F)。
將 PLC 傳輸位 (TX[1:0]) 寫入PLC_COM_CTRL寄存器以觸發最多三個字節的傳輸。寫入 TX[1:0] 字段的值指定要傳輸的字節數。(PLC_COM_CTRL在登記冊0x09中)。
圖2.流程圖顯示了使用MAX20340通過電源線傳輸數據的步驟。
接收數據
接收從另一個MAX20340發送的數據也非常簡單。斷言“新數據”中斷,指定接收數據時的字節數。然后,可以通過I2C在三個8位接收數據字節寄存器中讀取接收的數據。
等待新數據中斷(NEW_DATA1i并在寄存器2x0B中NEW_DATA0i)。
從接收數據字節寄存器(寄存器0x1、2x0 和 10x0)中讀取最多三個字節的接收數據(RX_DATA11、RX_DATA0 和寄存器中的RX_DATA12)。
圖3.流程圖顯示了使用MAX20340通過電源線接收傳輸數據的步驟。
主/從通信流程
在典型應用中,主從應用處理器遵循主/從通信順序并檢查傳輸錯誤。
MAX20340配置為主站,啟動所有PLC通信。配置為從機的MAX20340只能在主站向其發送數據后向主站發送數據。主站傳輸數據后,啟動定時器等待從站響應。如果計時器過期,則在主站上斷言PLC_TMRi中斷,表示從機沒有響應。在發送任何新數據之前,主站應等待從站響應或超時。
主機和從站還應檢查PLC_TX_ERRi和PLC_RX_ERRi中斷指定的傳輸錯誤。
例子
這些實現示例假設主從應用處理器的輸入引腳配置為中斷,連接到MAX20340的中斷引腳。調用“wait_for_interrupt()”會檢查此引腳的狀態并等待其為低電平。此功能的實現是特定于平臺的。調用“I2C_write_register(...)”和“I2C_read_register(...)”可啟動MAX8中20340位寄存器的讀寫,其實現也特定于平臺。
假設在每個示例中都已取消屏蔽所有相關中斷。其他一些實現通過 I 輪詢中斷寄存器2C 而不是取消屏蔽中斷并使用中斷引腳。
這些示例假設所有傳輸均以默認通信設置發送:24μs通信頻率、288mA PLC灌電流、奇偶校驗和10ms RX等待定時器。這些設置取決于應用程序。
將數據傳輸到單個從站
在本例中,PLC 主站連接到單個 PLC 從站(圖 1)。主站傳輸三個字節,從站以一個字節響應。主機應僅在處于“從站發現充電”狀態(FSM_STAT = 0b110)時嘗試傳輸數據。
主傳輸
主固件遵循以下基本結構,在設置中斷掩碼后傳輸三個字節:
將一組三個字節加載到 TX_DATA0-2 寄存器中。
通過在PLC_COM_CTRL寄存器中寫入 TX[1:0] 位來發送三個字節。
(可選)等待 NEWDATA1/2、TMR_ERR、TX_ERR 或 RX_ERR 中斷。
或者,如果收到 NEWDATA1/2 中斷,則從RX_DATA寄存器讀取從屬響應。
從屬接收
設置中斷掩碼后,從屬固件遵循以下基本結構,等待來自主站的數據,并可選擇在主站的等待計時器到期之前做出響應:
等待 RX_ERR 或 NEW_DATA1/2 中斷。
如果收到 NEWDATA1/2 中斷,則從 RX_DATA0-2 個寄存器讀取數據字節。
(可選)將響應加載到 TXDATA0 寄存器中。
(可選)通過在PLC_COM_CTRL寄存器中寫入 TX[1:0] 位來發送一個字節。
主傳輸固件示例代碼片段
主固件的代碼片段如下所示。在此示例中,數據字節、0x55、0x5A和0xA5由主站傳輸。此代碼旨在用作輔助開發的參考,不能按原樣使用。
/*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); }
將數據傳輸到兩個從站
在本例中,主機向兩個連接的從站之一傳輸三個字節(圖 4)。
圖4.主站和兩個從站之間通信接口的簡化框圖。
每個從機都配置了不同的RSEL電阻值,以確保它們具有唯一的PLC從機地址。目標接收方的 PLC 從地址被添加到第一個傳輸字節的 MSB 中。
從站以一個字節響應,并在響應字節的MSB中包含自己的PLC從地址。
有關本實現示例中使用的PLC從站尋址的更多詳細信息,請參閱本文檔的“多個從站注意事項”部分。
主傳輸
主固件遵循以下基本結構,在設置主等待計時器和中斷掩碼后傳輸三個字節:
將一組三個字節加載到 TX_DATA0-2 寄存器中(23 位中只有 24 位包含要發送的數據)。一位,即TX_DATA0的MSB,包含接收方的PLC從地址)。
通過在PLC_COM_CTRL寄存器中寫入 TX[1:0] 位來發送三個字節。
(可選)等待 NEWDATA1/2、TMR_ERR、TX_ERR 或 RX_ERR 中斷。
或者,如果收到 NEWDATA1/2 中斷,則從RX_DATA寄存器讀取從屬響應。
從屬接收
設置中斷掩碼后,從屬固件遵循以下基本結構,等待來自主站的數據,并可選擇在主站的等待計時器到期之前做出響應:
等待 RX_ERR 或 NEW_DATA1/2 中斷。
如果收到 NEWDATA1/2 中斷,則從 RX_DATA0-2 寄存器讀取數據字節。
讀取DEV_STATUS1寄存器的PS_ADD位。
檢查RX_DATA0的 MSB。如果 MSB 不等于 PS_ADD,請忽略接收到的數據。
(可選)將響應加載到 TXDATA0 寄存器中(7 位中只有 8 位包含要發送的數據)。一位,即 TX_DATA0 的 MSB,包含 PS_ADD 位)。
(可選)通過在PLC_COM_CTRL寄存器中寫入 TX[1:0] 位來發送一個字節。
主傳輸固件示例代碼片段
主固件的代碼片段如下所示。在此示例中,數據字節0x55、0x5A和0xA5由主站傳輸。數據以PLC從站地址“1”傳輸到從站。因此,發送的實際數據是0xD5、0x5A和0xA5(PLC 從地址添加到字節 1 的 MSB 中)。此代碼旨在用作輔助開發的參考,不能按原樣使用。
/*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); }
從站接收固件示例代碼片段
從固件的代碼片段如下所示。從站通過發送單個字節來響應接收到的數據:在本例中0x55。該從站的PLC從站地址為“1”。因此,發送的實際數據是0xD5(PLC從地址被添加到字節1的MSB)。此代碼旨在用作輔助開發的參考,不能按原樣使用。
/*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主機可以連接任意數量的從機。PLC上的最大從站數量僅受主站可以提供的最大充電電流(1.2A)和PLC上的總電容的限制。
應使用用戶定義的尋址方案,以防止當PLC主站與兩個或多個PLC從機接口時,多個從站嘗試同時響應。PLC從地址在傳輸過程中不會自動使用,盡管RSEL電阻可用于為從機分配具有唯一PLC從地址的從機。
當主站傳輸數據時,所有連接的從站都會接收數據,無論其配置的PLC從站地址如何。當 PLC 主站打算僅將數據包發送到其中一個 PLC 從站時,應在數據字節中嵌入唯一標識預期接收方的地址。用戶可以靈活地將地址分配給任何數據字節位。
RSEL 設置的 PLC 從地址僅為 1 位。因此,它僅在尋址最多兩個從站時才有用。如果連接了兩個以上的PLC從站,則必須使用更多位傳輸的數據字節來唯一地尋址所有從站。
所有PLC從站接收相同的數據。因此,每個從站的應用處理器都應該從傳輸的數據中提取地址位,并將其與自己的唯一地址進行比較,以確定它是否是預期的接收者。然后,預期的從站相應地處理數據,而其他從站則簡單地丟棄數據。
雙從機尋址示例
假設有兩個連接的從站,第一個具有PLC從地址“0”,第二個具有PLC從地址“1”(基于RSEL值并存儲在DEV_STATUS1寄存器的PS_ADD位中)。用戶選擇將目標接收方的PLC從地址編碼為第一個字節的最高有效位。
主機向第一個從站發送 23 位數據,如下所示:
字節 1: '0xxxx' 字節 2: 'xxxx'
字節 3: 'xxxxxx'
其中x是23位數據,字節1的MSB包含第一個從站的PLC從地址('0')。
主機向第二個從設備發送23位數據,如下所示:
字節 1: '1xxxx' 字節 2: 'xxxx'
字節 3: 'xxxxxxx'
其中x是23位數據,字節1的MSB包含第二個從站的PLC從地址(“1”)。
當主站傳輸此數據時,兩個從站都將接收數據。
當從站接收數據時,如果字節1的MSB與配置的PLC從地址匹配,則此數據適用于它,并且應該處理數據。 如果MSB與配置的PLC從地址不匹配,則此數據不適用于它,它應該簡單地丟棄/忽略數據。
如果預期的接收者從站響應主站,則所有其他從站也會收到響應。在具有多個從站的從站響應期間,預期的接收方從站自己的PLC從站地址應嵌入到響應的數據字節中。這可確保其他從站丟棄/忽略預期的從站對主站的響應。
請注意,這不是必需的,PLC協議中沒有內置從站尋址。如果用戶應用程序不要求兩個從站接收不同的數據,并且從屬機從不嘗試同時響應主站,則唯一地址不需要嵌入到數據字節中。如果未使用從站尋址方案,則兩個從站都接收主站發送的數據。如果任何從站響應主站,則所有其他從站將此響應視為接收到的數據。如果兩個從站嘗試同時響應,則會發生通信錯誤。適當的從站尋址方案可以防止此類錯誤。
審核編輯:郭婷
-
電源
+關注
關注
184文章
17704瀏覽量
249959 -
寄存器
+關注
關注
31文章
5336瀏覽量
120230 -
plc
+關注
關注
5010文章
13271瀏覽量
463055
發布評論請先 登錄
相關推薦
評論