mirror of
https://github.com/libretro/Mu.git
synced 2026-09-23 07:05:37 +00:00
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:
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user