2015-03-31 88 views
1

我在SPI主模式下使用PIC 18F46K22與ADC芯片進行通信。 FOSC頻率爲64MHz(帶PLL的外部16MHz晶振),所以根據PIC手冊,最大SPI速度應爲FOSC/4 = 16MHz。但是當我使用SPI發送8位數據時,大約需要發送1.6us。這意味着SPI的速度只有5MHz左右。我的編譯器是MicroC PRO for PIC,我已經使用SPI庫函數來通過SPI初始化和讀取數據。任何人都可以幫我解決這個問題嗎?PIC 18F46K22 SPI速度

這是我如何初始化SPI1:

SPI1_Init_Advanced(_SPI_MASTER_OSC_DIV4, _SPI_DATA_SAMPLE_END, _SPI_CLK_IDLE_HIGH, _SPI_HIGH_2_LOW); 

和這些是代碼行經由SPI來讀取數據:

Take1 = SPI1_Read(0); // MSB of ADC shift register 
Take2 = SPI1_Read(0); 
Take3 = SPI1_Read(0); // LSB of ADC shift register 

我用外部晶體(HS振盪器)。我在MikroC PRO sotfware的「Edit Project」部分做了相應的設置(振盪器選擇:HS振盪器(高功率> 16 MHz),4X PLL使能:啓用)。

+1

嗨,歡迎來到StackOverflow。如果您可以發佈您用來初始化和讀取SPI數據的代碼(即使您只是調用庫中的函數),這將會很有幫助。當我們看不到您所做的事情時,很難排除故障。看看你是如何初始化你的振盪器也是有用的。 – 2015-03-31 17:15:26

+0

你對晶體有什麼價值的負載電容?你如何測量1.6us的時間間隔?你有沒有嘗試過使用帶有PLL的內部16MHz HFINTOSC而不是外部晶振? – 2015-04-02 12:37:22

回答

1

我建議你這樣的解決方案:

初始化與16MHz的內部振盪器的PIC,並啓用4X PLL在MIKROC編輯器。 然後,將RA6引腳設置爲CLOCKOUT,這將輸出您的系統頻率/ 4。​​ 這意味着,如果您的64MHz初始化良好,您將在RA6上獲得16MHz的方波。如果它被設置

OSCCON2.PLLRDY 

(1),那麼你的時鐘是由PLL來:

OSCCON = 0b01110010; //Enable 16MHz internal oscillator, running from INTOSC 
OSCTUNE.PLLEN = 1; //Enable PLL operation, 4x clock set from HFINTOSC 

嘗試讀取該位的狀態。否則,它沒有正確啓用。