Fixed the ordering of the chips -- I had the bytes reversed. Now, when I write/read a continuous stream of data, the bytes will correspond with the correct chips.

This commit is contained in:
Doug Brown 2011-12-17 11:18:56 -08:00
parent b052bb62f8
commit 540e04331a
3 changed files with 40 additions and 48 deletions

View File

@ -133,15 +133,7 @@ void ExternalMem_Read(uint32_t startAddress, uint32_t *buf, uint32_t len)
// Shouldn't need to wait here. Each clock cycle at 16 MHz is 62.5 nanoseconds, so by the time the SPI
// read has been signaled with the SPI chip, there will DEFINITELY be good data on the data bus.
// (Considering these chips will be in the 70 ns or 140 ns range, that's only a few clock cycles at most)
// TODO: Change the read data routines to put them in the correct order as is so I don't have to do this
// (Might shave a second or so off the read time)
uint32_t tmp = ExternalMem_ReadData();
tmp = (tmp & 0xFF) << 24 |
((tmp >> 8) & 0xFF) << 16 |
((tmp >> 16) & 0xFF) << 8 |
((tmp >> 24) & 0xFF) << 0;
*buf++ = tmp;
*buf++ = ExternalMem_ReadData();
}
}

View File

@ -164,12 +164,12 @@ void MCP23S17_WriteBothRegs(uint8_t addrA, uint16_t value)
tmp = SPDR;
// Write the first byte of the register
SPDR = (uint8_t)(value & 0xFF);
SPDR = (uint8_t)((value >> 8) & 0xFF);
while ((SPSR & (1 << SPIF)) == 0);
tmp = SPDR;
// It should auto-increment to the "B" register, now write that
SPDR = (uint8_t)((value >> 8) & 0xFF);
SPDR = (uint8_t)(value & 0xFF);
while ((SPSR & (1 << SPIF)) == 0);
tmp = SPDR;
@ -199,12 +199,12 @@ uint16_t MCP23S17_ReadBothRegs(uint8_t addrA)
// Read the first byte of the register
SPDR = 0;
while ((SPSR & (1 << SPIF)) == 0);
returnVal = SPDR;
returnVal = (((uint16_t)SPDR) << 8);
// It should auto-increment to the "B" register, now read that
SPDR = 0;
while ((SPSR & (1 << SPIF)) == 0);
returnVal |= (((uint16_t)SPDR) << 8);
returnVal |= SPDR;
DEASSERT_CS();

70
ports.c
View File

@ -73,9 +73,9 @@ void Ports_SetDataOut(uint32_t data)
// used as outputs
// Set the actual outputted values
MCP23S17_SetPins(data & 0xFFFF); // D0-D15
PORTE = ((data >> 16) & 0xFF); // D16-D23
PORTF = ((data >> 24) & 0xFF); // D24-D31
MCP23S17_SetPins((data >> 16) & 0xFFFF); // D0-D15
PORTE = ((data >> 8) & 0xFF); // D16-D23
PORTF = ((data >> 0) & 0xFF); // D24-D31
}
void Ports_DataOut_RMW(uint32_t data, uint32_t modifyMask)
@ -85,15 +85,15 @@ void Ports_DataOut_RMW(uint32_t data, uint32_t modifyMask)
// Read what's in it first...
uint16_t outputLatches = MCP23S17_GetOutputs();
outputLatches |= (modifiedDataOn) & 0xFFFF;
outputLatches &= modifiedDataOff & 0xFFFF;
outputLatches |= (modifiedDataOn >> 16) & 0xFFFF;
outputLatches &= (modifiedDataOff >> 16) & 0xFFFF;
MCP23S17_SetPins(outputLatches);
// Turn on/off requested bits in the PORT register.
PORTE |= ((modifiedDataOn >> 16) & 0xFF);
PORTE &= ((modifiedDataOff >> 16) & 0xFF);
PORTF |= ((modifiedDataOn >> 24) & 0xFF);
PORTF &= ((modifiedDataOff >> 24) & 0xFF);
PORTE |= ((modifiedDataOn >> 8) & 0xFF);
PORTE &= ((modifiedDataOff >> 8) & 0xFF);
PORTF |= ((modifiedDataOn >> 0) & 0xFF);
PORTF &= ((modifiedDataOff >> 0) & 0xFF);
}
void Ports_SetCSOut(bool data)
@ -172,9 +172,9 @@ void Ports_SetDataDDR(uint32_t ddr)
{
if (savedDataDDR != ddr)
{
MCP23S17_SetDDR(ddr & 0xFFFF); // D0-D15
DDRE = ((ddr >> 16) & 0xFF); // D16-D23
DDRF = ((ddr >> 24) & 0xFF); // D24-D31
MCP23S17_SetDDR((ddr >> 16) & 0xFFFF); // D0-D15
DDRE = ((ddr >> 8) & 0xFF); // D16-D23
DDRF = ((ddr >> 0) & 0xFF); // D24-D31
savedDataDDR = ddr;
}
@ -187,33 +187,33 @@ void Ports_DataDDR_RMW(uint32_t ddr, uint32_t modifyMask)
uint32_t modifiedDataOff = ddr | ~modifyMask;
// If we can get away with it, don't bother reading back...
if ((modifyMask & 0xFFFF) == 0xFFFF)
if (((modifyMask >> 16) & 0xFFFF) == 0xFFFF)
{
MCP23S17_SetDDR(modifiedDataOn & 0xFFFF);
MCP23S17_SetDDR((modifiedDataOn >> 16) & 0xFFFF);
// Remember what the new DDR will be
newSavedDataDDR = modifiedDataOn & 0xFFFF;
newSavedDataDDR = (modifiedDataOn & 0xFFFF0000UL);
}
else // Otherwise, we have to read what's in it first...(unless I decide to keep a local cached copy)
{
uint16_t outputLatches = MCP23S17_GetDDR();
outputLatches |= (modifiedDataOn) & 0xFFFF;
outputLatches &= modifiedDataOff & 0xFFFF;
outputLatches |= (modifiedDataOn >> 16) & 0xFFFF;
outputLatches &= (modifiedDataOff >> 16) & 0xFFFF;
MCP23S17_SetDDR(outputLatches);
// Remember what the new DDR will be
newSavedDataDDR = outputLatches;
newSavedDataDDR = ((uint32_t)outputLatches << 16);
}
// Turn on/off requested bits in the DDR register.
DDRE |= ((modifiedDataOn >> 16) & 0xFF);
DDRE &= ((modifiedDataOff >> 16) & 0xFF);
DDRF |= ((modifiedDataOn >> 24) & 0xFF);
DDRF &= ((modifiedDataOff >> 24) & 0xFF);
DDRE |= ((modifiedDataOn >> 8) & 0xFF);
DDRE &= ((modifiedDataOff >> 8) & 0xFF);
DDRF |= ((modifiedDataOn >> 0) & 0xFF);
DDRF &= ((modifiedDataOff >> 0) & 0xFF);
// Remember what the new DDR will be
newSavedDataDDR |= ((uint32_t)DDRE) << 16;
newSavedDataDDR |= ((uint32_t)DDRF) << 24;
newSavedDataDDR |= ((uint32_t)DDRE) << 8;
newSavedDataDDR |= ((uint32_t)DDRF) << 0;
// Save the new DDR
savedDataDDR = newSavedDataDDR;
@ -270,23 +270,23 @@ void Ports_DataPullups_RMW(uint32_t pullups, uint32_t modifyMask)
uint32_t modifiedDataOff = pullups | ~modifyMask;
// If we can get away with it, don't bother reading back...
if ((modifyMask & 0xFFFF) == 0xFFFF)
if (((modifyMask >> 16) & 0xFFFF) == 0xFFFF)
{
MCP23S17_SetPullups(modifiedDataOn & 0xFFFF);
MCP23S17_SetPullups((modifiedDataOn >> 16) & 0xFFFF);
}
else // Otherwise, we have to read what's in it first...(unless I decide to keep a local cached copy)
{
uint16_t outputLatches = MCP23S17_GetPullups();
outputLatches |= (modifiedDataOn) & 0xFFFF;
outputLatches &= modifiedDataOff & 0xFFFF;
outputLatches |= (modifiedDataOn >> 16) & 0xFFFF;
outputLatches &= (modifiedDataOff >> 16) & 0xFFFF;
MCP23S17_SetPullups(outputLatches);
}
// Turn on/off requested bits in the PORT register for the other 16 bits.
PORTE |= ((modifiedDataOn >> 16) & 0xFF);
PORTE &= ((modifiedDataOff >> 16) & 0xFF);
PORTF |= ((modifiedDataOn >> 24) & 0xFF);
PORTF &= ((modifiedDataOff >> 24) & 0xFF);
PORTE |= ((modifiedDataOn >> 8) & 0xFF);
PORTE &= ((modifiedDataOff >> 8) & 0xFF);
PORTF |= ((modifiedDataOn >> 0) & 0xFF);
PORTF &= ((modifiedDataOff >> 0) & 0xFF);
}
void Ports_SetCSPullup(bool pullup)
@ -338,11 +338,11 @@ uint32_t Ports_ReadAddress(void)
uint32_t Ports_ReadData(void)
{
uint32_t result = (uint32_t)MCP23S17_ReadPins();
uint32_t result = (uint32_t)MCP23S17_ReadPins() << 16;
// Grab the other two bytes...
result |= (((uint32_t)PINE) << 16);
result |= (((uint32_t)PINF) << 24);
result |= (((uint32_t)PINE) << 8);
result |= (((uint32_t)PINF) << 0);
return result;
}