SPI2 dosent alway shift out the top bit

It shifts out from bit transferSize - 1 and shifts in to bit 0.
With this my test suite can now read the touchscreen without running private APIs.(the ADC value range wrong though because its read too fast)
This commit is contained in:
meepingsnesroms
2018-07-03 10:54:59 -07:00
parent 0990509918
commit a5dfc21d43
3 changed files with 20 additions and 13 deletions

View File

@@ -478,7 +478,6 @@ var selfProbeSpi2(){
static Boolean firstRun = true;
uint16_t testWriteValue = 0xF0F1;
uint16_t y = 0;
uint8_t scootTest = 0x0F;
if(firstRun){
firstRun = false;
@@ -490,23 +489,28 @@ var selfProbeSpi2(){
exitSubprogram();
}
writeArbitraryMemory16(HW_REG_ADDR(SPIDATA2), 0x0001);
/*enable SPI2*/
writeArbitraryMemory16(HW_REG_ADDR(SPICONT2), 0x0200);
/*set output value*/
writeArbitraryMemory16(HW_REG_ADDR(SPIDATA2), 0x00F0);
StrPrintF(sharedDataBuffer, "SPIDATA2:0x%04X", readArbitraryMemory16(HW_REG_ADDR(SPIDATA2)));
UG_PutString(0, y, sharedDataBuffer);
y += FONT_HEIGHT + 1;
writeArbitraryMemory16(HW_REG_ADDR(SPICONT2), 0x0200);/*enable SPI2*/
writeArbitraryMemory16(HW_REG_ADDR(SPICONT2), 0x0300);/*shift in 1 bit*/
StrPrintF(sharedDataBuffer, "Shift left 1");
writeArbitraryMemory16(HW_REG_ADDR(SPICONT2), 0x0301);/*shift in 2 bits*/
StrPrintF(sharedDataBuffer, "Shift left 2");
UG_PutString(0, y, sharedDataBuffer);
y += FONT_HEIGHT + 1;
StrPrintF(sharedDataBuffer, "New SPIDATA2:0x%04X", readArbitraryMemory16(HW_REG_ADDR(SPIDATA2)));
UG_PutString(0, y, sharedDataBuffer);
y += FONT_HEIGHT + 1;
StrPrintF(sharedDataBuffer, "Scoot Test:0x%04X", scootTest << 8);
writeArbitraryMemory16(HW_REG_ADDR(SPICONT2), 0xE000);/*disable SPI2*/
StrPrintF(sharedDataBuffer, "Disabled SPICONT2:0x%04X", readArbitraryMemory16(HW_REG_ADDR(SPICONT2)));
UG_PutString(0, y, sharedDataBuffer);
y += FONT_HEIGHT + 1;
StrPrintF(sharedDataBuffer, "Scoot Test 2:0x%04X", (uint16_t)scootTest << 8);
writeArbitraryMemory16(HW_REG_ADDR(SPICONT2), 0xC000);/*write after disabled test*/
StrPrintF(sharedDataBuffer, "Written SPICONT2:0x%04X", readArbitraryMemory16(HW_REG_ADDR(SPICONT2)));
UG_PutString(0, y, sharedDataBuffer);
y += FONT_HEIGHT + 1;

View File

@@ -73,24 +73,24 @@ uint16_t ads7846GetValue(uint8_t channel, Boolean referenceMode, Boolean mode8bi
writeArbitraryMemory16(HW_REG_ADDR(SPICONT2), 0x4207);
/*set data to send*/
writeArbitraryMemory16(HW_REG_ADDR(SPIDATA2), config << 8);
writeArbitraryMemory16(HW_REG_ADDR(SPIDATA2), config);
/*send data*/
writeArbitraryMemory16(HW_REG_ADDR(SPICONT2), 0x4307);
while(readArbitraryMemory16(HW_REG_ADDR(SPICONT2)) & 0x0100);
/*receive data*/
writeArbitraryMemory16(HW_REG_ADDR(SPICONT2), 0x4300 | (mode8bit ? 0x0008 : 0x000C));
writeArbitraryMemory16(HW_REG_ADDR(SPICONT2), 0x4300 | (mode8bit ? 0x0007 : 0x000B));
while(readArbitraryMemory16(HW_REG_ADDR(SPICONT2)) & 0x0100);
/*get value returned*/
value = readArbitraryMemory16(HW_REG_ADDR(SPIDATA2));
value = readArbitraryMemory16(HW_REG_ADDR(SPIDATA2)) & (mode8bit ? 0x00FF : 0x0FFF);
/*disable SPI2*/
writeArbitraryMemory16(HW_REG_ADDR(SPICONT2), 0xE000);
/*misc configs from HwrADC*/
*((uint8_t*)0xFFFFF431) |= 0x04;
//*((volatile uint8_t*)0xFFFFF431) |= 0x04;
return value;
}

View File

@@ -248,12 +248,15 @@ static inline void setSpiCont2(uint16_t value){
if(value & oldSpiCont2 & 0x0200 && value & 0x0100){
//enabled and exchange set
uint8_t bitCount = (value & 0x000F) + 1;
uint16_t startBit = 1 << (bitCount - 1);
uint16_t spi2Data = registerArrayRead16(SPIDATA2);
//uint16_t oldSpi2Data = spi2Data;
//the input data is shifted into the unused bits if the transfer is less than 16 bits
for(uint8_t bits = 0; bits < bitCount; bits++){
bool newBit = ads7846ExchangeBit(spi2Data & startBit);
spi2Data <<= 1;
spi2Data |= ads7846ExchangeBit(spi2Data & 0x8000);
spi2Data |= newBit;
}
registerArrayWrite16(SPIDATA2, spi2Data);