Merge pull request #683 from quietboil/master
Fixed command and address in LSB mode
This commit is contained in:
commit
2cded08ce4
1 changed files with 20 additions and 4 deletions
|
@ -294,8 +294,17 @@ static inline void spi_set_command(uint8_t bus, uint8_t bits, uint16_t data)
|
||||||
if (!bits) return;
|
if (!bits) return;
|
||||||
|
|
||||||
SPI(bus).USER0 |= SPI_USER0_COMMAND; //enable COMMAND function in SPI module
|
SPI(bus).USER0 |= SPI_USER0_COMMAND; //enable COMMAND function in SPI module
|
||||||
uint16_t command = data << (16 - bits); //align command data to high bits
|
uint16_t command;
|
||||||
|
// Commands are always sent using little endian byte order
|
||||||
|
if (!spi_get_msb(bus)) {
|
||||||
|
// "data" are natively little endian, with LSB bit order
|
||||||
|
// this makes all bits of the command ready to be sent as-is
|
||||||
|
command = data;
|
||||||
|
} else {
|
||||||
|
// MSB
|
||||||
|
command = data << (16 - bits); //align command data to high bits
|
||||||
command = ((command >> 8) & 0xff) | ((command << 8) & 0xff00); //swap byte order
|
command = ((command >> 8) & 0xff) | ((command << 8) & 0xff00); //swap byte order
|
||||||
|
}
|
||||||
SPI(bus).USER2 = SET_FIELD(SPI(bus).USER2, SPI_USER2_COMMAND_BITLEN, --bits);
|
SPI(bus).USER2 = SET_FIELD(SPI(bus).USER2, SPI_USER2_COMMAND_BITLEN, --bits);
|
||||||
SPI(bus).USER2 = SET_FIELD(SPI(bus).USER2, SPI_USER2_COMMAND_VALUE, command);
|
SPI(bus).USER2 = SET_FIELD(SPI(bus).USER2, SPI_USER2_COMMAND_VALUE, command);
|
||||||
}
|
}
|
||||||
|
@ -320,7 +329,14 @@ static inline void spi_set_address(uint8_t bus, uint8_t bits, uint32_t data)
|
||||||
if (!bits) return;
|
if (!bits) return;
|
||||||
|
|
||||||
SPI(bus).USER0 |= SPI_USER0_ADDR; //enable ADDRess function in SPI module
|
SPI(bus).USER0 |= SPI_USER0_ADDR; //enable ADDRess function in SPI module
|
||||||
|
// addresses are always sent using big endian byte order
|
||||||
|
if (spi_get_msb(bus)) {
|
||||||
SPI(bus).ADDR = data << (32 - bits); //align address data to high bits
|
SPI(bus).ADDR = data << (32 - bits); //align address data to high bits
|
||||||
|
} else {
|
||||||
|
// swap bytes from native little to command's big endian order
|
||||||
|
// bits in each byte are already arranged properly for LSB
|
||||||
|
SPI(bus).ADDR = (data & 0xff) << 24 | (data & 0xff00) << 8 | ((data >> 8) & 0xff00) | ((data >> 24) & 0xff);
|
||||||
|
}
|
||||||
SPI(bus).USER1 = SET_FIELD(SPI(bus).USER1, SPI_USER1_ADDR_BITLEN, --bits);
|
SPI(bus).USER1 = SET_FIELD(SPI(bus).USER1, SPI_USER1_ADDR_BITLEN, --bits);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue