2013-07-15 47 views
0

我正在嘗試使用LPC1788微控制器編寫程序,並且需要使用SPI協議將數據發送和傳輸到UFDC(通用頻率 - 數字轉換器)。 A的數據表可以找到here。我的微控制器的SSP控制器被設置爲主控制器,並且UFDC大概成爲從控制器。我可以沿着MOSI線傳輸信息,並看到數據顯示在示波器上。但是,當我嘗試接收MISO產品線上的數據時,我只能回收MOSI發送的內容。如何使用SPI與LPC1788傳輸和接收數據

Here is a picture of the schematic.

我寫的代碼的相關部分低於:

SSP_CFG_Type sspConfig; 
SSP_DATA_SETUP_Type sspData; 
LPC_SSP_TypeDef *SSPx = NULL; 

UFDC_RESULT_T result_SSP0_FX1, result_SSP0_FX2; 
UFDC_RESULT_T result_SSP1_FX1, result_SSP1_FX2; 
UFDC_RESULT_T *result, *resultFX1, *resultFX2 = NULL; 

uint8_t resultSign; 
uint64_t resultInt, resultFract; 

uint8_t SSP0resultFX1sign, SSP0resultFX2sign; 
uint8_t SSP1resultFX1sign, SSP1resultFX2sign; 

uint64_t SSP0resultFX1int, SSP0resultFX2int; 
uint64_t SSP1resultFX1int, SSP1resultFX2int; 

uint64_t SSP0resultFX1fract, SSP0resultFX2fract; 
uint64_t SSP1resultFX1fract, SSP1resultFX2fract; 

uint16_t getAccInstr = 0x01FF; 
uint16_t setAccInstr = 0x0204; 
uint16_t checkStatusInstr = 0x03FF; 
uint16_t setMeasureModeInstr1 = 0x0600; 
uint16_t setMeasureModeInstr2 = 0x060E; 
uint16_t getBCDResultInstr = 0x07FF; 
uint8_t startMeasureInstr = 0x09; 

uint32_t measureInstr; 

uint8_t txData[2]; 
uint8_t rxData[2]; 

uint16_t data; 

sspConfig.CPHA = SSP_CPHA_FIRST; 
sspConfig.CPOL = SSP_CPOL_HI; 
sspConfig.ClockRate = 100000; 
sspConfig.Databit = SSP_DATABIT_8; 
sspConfig.Mode = SSP_MASTER_MODE; 
sspConfig.FrameFormat = SSP_FRAME_SPI; 

sspData.tx_data = txData; 
sspData.rx_data = rxData; 
sspData.length = 2; 

printf("Initialising SSP0 and SSP1...\n\n"); 

PINSEL_ConfigPin(0, 15, 2); // SSP0_SCK 
PINSEL_ConfigPin(0, 16, 2); // SSP0_SSEL 
PINSEL_ConfigPin(0, 17, 2); // SSP0_MISO 
PINSEL_ConfigPin(0, 18, 2); // SSP0_MOSI 
PINSEL_ConfigPin(0, 6, 2); // SSP1_SCK 
PINSEL_ConfigPin(0, 7, 2); // SSP1_SSEL 
PINSEL_ConfigPin(0, 8, 2); // SSP1_MISO 
PINSEL_ConfigPin(0, 9, 2); // SSP1_MOSI 

PINSEL_SetFilter(0, 7, DISABLE); 
PINSEL_SetFilter(0, 8, DISABLE); 
PINSEL_SetFilter(0, 9, DISABLE); 

SSP_Init(LPC_SSP0, &sspConfig); 
SSP_Init(LPC_SSP1, &sspConfig); 
SSP_Cmd(LPC_SSP0, ENABLE); 
SSP_Cmd(LPC_SSP1, ENABLE); 

printf("Reading UDFC frequency values...\n\n"); 
for(int i=0; i < 2; i++) 
{ 
    if(i == 0) 
    { 
    SSPx = LPC_SSP0; 
    resultFX1 = &result_SSP0_FX1; 
    resultFX2 = &result_SSP0_FX2; 
    } 
    else 
    { 
    SSPx = LPC_SSP1; 
    resultFX1 = &result_SSP1_FX1; 
    resultFX2 = &result_SSP1_FX2; 
    } 

    // Set UFDC accuracy to 0.05%. 
    SSP_SendData(SSPx, (uint8_t)(setAccInstr >> 8)); 
    SSP_SendData(SSPx, (uint8_t)(setAccInstr & 0xFF)); 

    // Check accuracy. 
    while(1) 
    { 
    SSP_SendData(SSPx, (uint8_t)(getAccInstr >> 8)); 
    SSP_SendData(SSPx, (uint8_t)(getAccInstr & 0xFF)); 

    data = SSP_ReceiveData(SSPx); 
    printf("Accuracy check 1: %i\n", data >> 8); 
    printf("Accuracy check 2: %i\n", data & 0xFF); 
    } 
// More code follows. 

我從此得到的輸出如下:

Accuracy check 1: 0 
Accuracy check 2: 0 
Accuracy check 1: 0 
Accuracy check 2: 255 
Accuracy check 1: 0 
Accuracy check 2: 2 
Accuracy check 1: 0 
Accuracy check 2: 4 
Accuracy check 1: 0 
Accuracy check 2: 1 
Accuracy check 1: 0 
Accuracy check 2: 255 
Accuracy check 1: 0 
Accuracy check 2: 1 
Accuracy check 1: 0 
Accuracy check 2: 255 
Accuracy check 1: 0 
Accuracy check 2: 1 
Accuracy check 1: 0 
Accuracy check 2: 255 

編輯:這是可以使用SPI控制器設置「迴路使能」以使MOSI從MISO讀取輸入,反之亦然。但是,我已經檢查了相關的寄存器,並且這是禁用的。

+1

Err ..任何短褲? –

+0

我希望不會,我會讓我的老闆看看pcb來仔細檢查,但這已經是板子II的版本了。 – Tagc

+0

板上有兩個UFDC/SSP控制器。我已經用兩種測試,他們都表現出同樣的問題。這幾乎肯定是一個軟件問題。 – Tagc

回答

0

通過SPI發送一個字節後,必須再次清除數據寄存器(DR)中的一個字節。

在SPI中,你總是發送和接收一個字節你不能只發送或接收一個字節,它總是AND。技術上的解釋是隻有一條時鐘線和兩條數據線(MISO和MOSI)

0

我想你應該檢查接收FIFO非空標誌,就在用這行代碼讀取數據之前:

而(!(LPC_SSP0-> SR & SSP_SR_RNE)); //輪詢接收FIFO不空標誌

和SPI初始化,你應該清除與這些代碼行接收FIFO:

while (LPC_SSP0->SR & SSP_SR_RNE){ 
    tmp = (uint32_t) SSP_ReceiveData(LPC_SSP0); 
} 

希望它能起作用!

相關問題