我有一個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
你寫「*(我這裏省略了狀態標誌檢查!)*」 不要忽略的一部分。這正是我與PIC24和SPI模塊緊密相連的地方。 讓我們看看這段代碼。 – 2014-11-22 06:04:49
最終的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
我將此問題提交給Microchip論壇,現在已經修復。 請參閱 http://www.microchip.com/forums/m836595.aspx?tree=true – anatom13 2014-12-21 15:40:53