簡體   English   中英

發送2個SPI字節

[英]Sending 2 SPI Bytes ISSUE

當使用ATMega328硬件SPI接口時,程序會在第二個字節上吸吮。

我嘗試讀取SPDR以清除SPSR中的SPIF位,我認為在繼續執行代碼之前必須清除該標志

PORTB &= !(1<<SSDAC); // Pulling slave select low
_delay_ms(10);

Serial.println("Sending MSB");
SPDR = MSByte;
while (!(SPSR & (1 << SPIF)));

Serial.println("Sending LSB");
SPDR = LSByte;
while (!(SPSR & (1 << SPIF)));

Serial.println("Sent!");
_delay_ms(10);
PORTB |= (1<<SSDAC); // Pulling slave select high

我的串行監視器即將達到“正在發送LSB”。 在此之后刪除while循環將允許代碼繼續進行,但這意味着未發送數據。

PS刪除第一個while循環后,它將繼續進行並顯示“已發送!”。 但是,當代碼第二次重復時; 它再次被卡在“發送LSB”上...我現在甚至嘗試過使用Arduino SPI庫...仍然卡住!

PORTB &= ~(1 << SSDAC);
_delay_us(1);
Serial.println(bits, BIN);
data = SPI.transfer16(MSByte);
Serial.println("Sent!");
_delay_us(1);
PORTB |= (1 << SSDAC);

它打印已發送(發送)的位,但是代碼被卡住並且沒有到達“已發送!” ...

您是否將SS引腳配置為輸出? 使用ATMega SPI時,這是常見的疏忽。

從手冊中:

當將SPI配置為主機(設置SPCR中的MSTR)時,用戶可以確定SS引腳的方向。 如果將SS配置為輸出,則該引腳為通用輸出引腳,不會影響SPI系統。 通常,該引腳將驅動SPI從設備的SS引腳。 如果將SS配置為輸入,則必須將其保持高電平以確保主SPI操作。 如果將SPI配置為主機且將SS引腳定義為輸入時,外圍電路將SS引腳驅動為低電平,則SPI系統會將其解釋為另一個主機,選擇SPI作為從機並開始向其發送數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM