2014-11-20 118 views
0

我有一個MPLAB入門套件板與μCPIC24FJ256GB106,在3線SPI連接通過SPI的連接加速度計芯片ADXL375委員會(這似乎不是我的問題的原因)通信(不使用SDO) 我配置外設引腳選擇激活SPI模塊1:PIC24 SPI主拒絕接收時鐘發生

void MapSPIModulPins() 
{ 
__builtin_write_OSCCONL(OSCCON&0xbf); //! PPSUnLock 
RPOR1bits.RP3R = 8 ; //! Assign RP3 as Output Pin To SPI1 Clock Output. 
RPOR2bits.RP4R = 7 ; //! Assign RP4 as Output Pin SPI1 Data Output. 
//RPOR1bits.RP2R = 9 ; //! Assign RP2 as Output Pin Where is SPI1 Slave Select Output. SS1OUT 
__builtin_write_OSCCONL(OSCCON|0x40); //! PPSLock 

//! Extra digital output as Chip Select 
TRISDbits.TRISD8 = 0; // Thomas 18.11.2014 
} 

的SPI被配置有:

void SPIsetup1ForMasterMode() 
{ 
IFS0bits.SPI1IF = 0; // Clear the Interrupt flag 
IEC0bits.SPI1IE = 0; // Disable the interrupt 

// SPI1CON1 Register Settings 
SPI1STATbits.SPIEN = 0; //! Thomas(THOMAHPS) 20.11.2014 Disable SPI module 
SPI1CON1bits.DISSCK = 0; // Internal serial clock is enabled 
SPI1CON1bits.DISSDO = 0; // SDOx pin is controlled by the module 
SPI1CON1bits.MODE16 = 0;// Communication is byte-wide (8 bits) // Thomas 17.11.2014 

SPI1CON1bits.MSTEN = 1; // Master mode enabled 
SPI1CON1bits.SMP = 0; // Input data is sampled at the middle of data output time 
SPI1CON1bits.CKE = 0; // Serial output data changes on transition from Idle clock state to active clock state 

// Idle clock state to active clock state 
SPI1CON1bits.CKP = 0; // Idle state for clock is a low level; 

// active state is a high level 
SPI1STATbits.SPIEN = 1; // Enable SPI module 
SPI1STATbits.SPIROV = 0 ; //! Thomas 20.11.2014 Clear the SPIROV bit ! 

// Interrupt Controller Settings 
IFS0bits.SPI1IF = 0; // Clear the Interrupt flag 
IEC0bits.SPI1IE = 1; // Enable the interrupt 
} 

IMHO SPI發送和接收之間的不對稱的行爲不能成立lised。

中斷處理程序是:

void __attribute__((interrupt,no_auto_psv)) _SPI1Interrupt(void) 
{ 
    IFS0bits.SPI1IF = 0;  //Clear Interrupt status of SPI1 
} 

然後我發送的數據字節與

SPI1BUF = anyBytePattern; 

,我可以在示波器上連同時鐘觀察。 接收數據可以被觸發(我這裏省略了狀態標誌檢查!)

unsigned int recvData = SPI1BUF; 

無論是在單人操作,也沒有死循環,對信號線沒有時鐘!

我將代碼嵌入到演示應用程序的適當位置,這應該不會干擾我的問題。
我嘗試了很多東西時滯,生產者的樣本代碼,社區等觀察
在調試會話沒有異常寄存器值(SPI錯誤標誌)。
從屬電子的分離在行爲上沒有區別。

這是PPS問題嗎?

我絆了製造商的SPI描述。
在文檔PIC24FJ256GB110系列數據表15.0串行外設接口(SPI)
「SPI串行接口包括四個引腳:
SDIx:串行數據輸入
的SDOx:串行數據輸出
當SCKx:移位時鐘輸入或輸出
的SSx:低電平有效從選擇或幀同步I/O脈衝
SPI模塊可以被配置爲使用2,3或4個引腳工作在3針模式,SSX。未使用。在 2-pin mod e,不使用SDOx和SSx。「
我同一文檔是64-PIN芯片PIC24FJ256GB106,它只有一個SPI數據信號稱爲SDA1的引出線,位於物理上銷NR 43
3 ++線SPI溶液如何能用這個芯片實現?

我映射該信號和SPI時鐘與PPS命令如上所示,參照 表10-3:可選擇的輸出源(功能映射到輸出)
功能SDO1(SPI1數據輸出)與代碼7和功能SCK1OUT(SPI1時鐘輸出)爲8

通信與我的SPI從需要寫型週期,我告訴他寄存器NR他回答我與價值。
這個PPS映射足以完成那項工作嗎?

輸入映射怎麼樣?

表10-2:可選擇的輸入源(將輸入映射到功能)
Funcions線SCK1IN(SPI1時鐘輸入),寄存器RPINR20,位SCK1R(5:0)
SDI1(SPI1數據輸入),寄存器RPINR20,比特SDI1R(5:0)

我添加的代碼行MapSPIModulPins():

RPINR20bits.SCK1R = 3 ; // because SCL1/RP「3「/PMCS2/CN55/RD10 
RPINR20bits.SDI1R = 4 ; // because DPLN/SDA1/RP「4「/CN54/RD9 

上閱讀仍沒有產生一個主時鐘週期由我PIC24 SPI模塊1

有什麼不對?

如果有人可以幫助 - 在此先感謝!
Thomas

+0

你寫「*(我這裏省略了狀態標誌檢查!)*」 不要忽略的一部分。這正是我與PIC24和SPI模塊緊密相連的地方。 讓我們看看這段代碼。 – 2014-11-22 06:04:49

+0

最終的3線SPI通信必須在總線+數據上寫入ADXL375寄存器地址,以寫入或讀取從機應提供的數據。 必須檢查SPITBF和SPIRBF位。 我試過了: 'unsigned int SPItransmit1Byte(unsigned char b)' '{' 'SPI1BUF = b; //寫入TX的緩衝區' '// @@ while(SPI1STATbits.SPITBF); //取消註釋並沒有區別' 'while(!SPI1STATbits.SPIRBF); //等待傳輸完成' 'return SPI1BUF; //讀取收到的值' '}' 在這段代碼中,PIC24必須提供2 * 8個時鐘週期,但在線上只有8個! – anatom13 2014-11-24 09:24:56

+0

我將此問題提交給Microchip論壇,現在已經修復。 請參閱 http://www.microchip.com/forums/m836595.aspx?tree=true – anatom13 2014-12-21 15:40:53

回答

0

這是PPS問題嗎? PPS似乎很好

3芯線SPI解決方案如何用這個芯片實現? - 只需單獨控制CS引腳即可。歸屬的CS引腳用於從模式。 - SDA適用於I2C而不適用於SPI。

輸入映射怎麼樣? 輸入如下進行:

_SDIxR=16;   //SDI 

16是RP16/RPi16,becarefull德RPI引腳只能是輸入,所以不要時鐘地圖上的RPI(RPI)引腳,它不會工作。

在上面的代碼中,我們看不到您是否設置了SPI模塊的時序,它可能太慢或太快。這是在SPIxCON1寄存器上完成的。

SPIxCON1bits.SPRE = 0b110; //secondary scale 111= prescale 1:1 
SPIxCON1bits.PPRE = 0b00; // primary scale 10 = prescale 4:1 
          // 16 MIPS -> 4MIPS 

進一步檢查:

  • 確保插針沒有在模擬模式下,如果他們用它複用(AN數據表上的引腳上)。

  • 對於調試,還需要確保主時鐘正在運行,例如您可以切換一個引腳並在其上運行探測。

  • 檢查你的電子,確保沒有像另一個IC驅動線路。如果芯片比平常更熱或耗電更多,那就是一個標誌。將該針腳設置爲輸入,您可以嘗試向下/向上拖動點擊線路,看看是否有短路。你也可以,如果你可以取消焊接引腳。