2015-06-05 31 views
0

我接收數據從USB到Atxmega 128A1的內部存儲器如何編寫通過SPI主從內部存儲器傳輸數據的代碼,以2從

if ((SWITCHPORTL.IN & PIN1_bm) == 0) 
    { 
     j = 0; 
     while (j < NUM_BYTES) 
     { 
      // Wait till there is unread data in the receive buffer 
      while((USART.STATUS & USART_RXCIF_bm) == 0){}; 
      // Read out the received data 
      __far_mem_write(j+SDRAM_ADDR, USART.DATA); 
      if (j == (NUM_BYTES-1)) 
      { 
       // Toggle LED 1 
       LEDPORT.OUTTGL = PIN1_bm; 
      } 
      j++; 
     } 
    } 

如何編寫經由SPI內部存儲器傳輸數據的代碼掌握兩個奴隸,這樣的奇數和偶數字節的數據應分別發送到兩個奴隸?如何啓動主站到兩個從站(多個從站)?

+0

這非常依賴於所需的幀格式奴隸。你必須閱讀數據手冊。回來,如果你有任何**特定的**問題與你的代碼。 – Olaf

+0

@Olaf對不起...我必須發佈該方法。但無法以編碼的方式發佈,因爲我是新來的。你能幫我嗎 –

+0

參加[tour](http://stackoverflow.com/tour)。你在這裏比我長。 – Olaf

回答

0

我認爲這大都是可能的,當兩個從站都能理解類似格式的數據,就像CPOL和CPHA具有相同的配置。您可以通過分別使能CS引腳來選擇一個特定的從機。所以,你的代碼可以是這樣的:

initMaster(); 
selectSlave1(); //Make CS1 low and CS2 high 
spiTransmit(data1); //transmit odd byte 
selectSlave2(); //Make CS2 low and CS1 high 
spiTransmit(data2); //transmit even byte 
+0

)可能無法正常工作,因爲在切換選擇時,SPI很可能仍在忙於移位,而且必須處理接收到的數據。此外:一旦選擇了Slave2,您同時選擇了活動(除非'selectSlave2()'意味着「取消選擇從設備1」)另外:如果設備在數據之前需要一個地址會怎麼樣呢?哪種格式?需要數據表(但對於這個站點來說太過分了) – Olaf

+0

- 我通常通過檢查這個標誌來實現spiTransmit()以確保發送完成:while(!(SPSR&(1 << SPIF))); - 你是對的,seletSlaven() - 取消選擇所有的slave,然後選擇從機n - 是的,如果需要地址,那也需要提供。 – Apoorv

+0

我認爲這個問題只涉及SPI的多路複用,對於2個不同的從機,似乎是可行的。 您可能有t只需將它們分別配置,等待初始化完成,然後發送一個字節並移至其他位置。 – Apoorv

0

由於所有從機都連接到同一總線只能是在你有兩個選項可以選擇一個時間傳輸一個數據:

  1. 實施簡單的協議,以便每個從機都知道,哪個字節屬於它。 (例如:長度爲6位長度和2位接收器代碼的一個字節頭或(1 - 從器件1,2從器件2 - 3兩個從器件均爲奇數)
  2. 使用從器件選擇引腳並傳輸一個字節並確保不要發送下一個,並取消選擇第一個接收器,直到舊的發送(計算時鐘週期需要多長時間,並將它們用於其他有用的東西)
相關問題