2016-04-19 74 views
0

我需要使用LPC1769將某些數據發送到帶SPI的FPGA。不過,我不太明白我應該如何處理這個問題。我目前有這個代碼,最終在硬故障處理程序。我不允許使用CMSIS,所以我必須自己定義寄存器。LPC1769上的SPI外設

void sendData(uint8_t *buf, uint32_t Length) { 
    uint32_t i; 
    for (i = 0; i < Length; i++) { 
     while (S0SPSR != (1 << 7)) { 
      S0SPDR = *buf; 
      gpio0WritePin(15, 1); 
      gpio0WritePin(15, 0); 
      buf++; 
     } 
    } 
return; 
} 

,我的主要功能:

uint8_t TX[16]; 
int main(void) { 
    SpiInit(); 
    TX[0] = 0x48; 
    TX[1] = 0x65; 
    TX[2] = 0x6c; 
    TX[3] = 0x6c; 
    TX[4] = 0x6f; 
    while (1) { 
     SPI_Begin(); 
     sendData((uint8_t*)TX, 5); 
     SPI_End(); 
    } 
} 
+0

問題可能在任何地方,特別是在此處未顯示的代碼中。你將需要調試它。檢查你的故障狀態寄存器並追蹤它。 –

+0

如果我將buf中的指針更改爲標準數組,它將不再以硬故障處理程序結束 – Arrrow

回答

1

你肯定不想去逐位數據SPI總線一樣,用這種現代的微控制器。

如果由於某種原因您不允許使用CMSIS,我建議您看看how CMSIS does SPI communication。打開它(或者更好:打印出來),然後使用LPC176x/5x User Manual中的「Chapter 17:LPC176x/5x SPI」作爲參考(第410-420頁)。代碼應該相當容易遵循。

簡而言之,你需要:

  • 能夠通過外設功率控制寄存器中的SPI控制器,
  • 安裝並啓用時鐘此外設(Perpheral時鐘選擇寄存器),
  • 通過SPI控制寄存器配置與SPI(MOSI,MISO,CLK,CS),時鐘極性等相關的I/O引腳...
  • 設置中斷,因此您不必浪費時間環繞狀態在等待新數據進入時註冊,
  • 使用SPI數據寄存器一次可讀寫8位數據。

不要忘了使用中斷,你的CPU週期最好使用比什麼都搗鼓數據(尤其是輪詢狀態寄存器,非常常見的錯誤很遺憾)。