我正在嘗試使用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讀取輸入,反之亦然。但是,我已經檢查了相關的寄存器,並且這是禁用的。
Err ..任何短褲? –
我希望不會,我會讓我的老闆看看pcb來仔細檢查,但這已經是板子II的版本了。 – Tagc
板上有兩個UFDC/SSP控制器。我已經用兩種測試,他們都表現出同樣的問題。這幾乎肯定是一個軟件問題。 – Tagc