Hi,
I'm have a soft SPI library which work fine on nano board, STM32 board but i discover that on attiny85, it doesn't get the MISO signal. After some borring search (nothing to debug on the attiny), i find this :
class TINYSPI {
public:
uint8_t mosi_bit;
uint8_t mosi_port;
volatile uint8_t *mosi_reg;
volatile uint8_t *mosi_out;
uint8_t miso_bit;
uint8_t miso_port;
volatile uint8_t *miso_reg;
volatile uint8_t *miso_out;
volatile uint8_t *miso_in;
uint8_t sck_bit;
uint8_t sck_port;
volatile uint8_t *sck_reg;
volatile uint8_t *sck_out;
TINYSPI(uint8_t _mosi, uint8_t _miso, uint8_t _sck) {
mosi_bit = digitalPinToBitMask(_mosi);
mosi_port = digitalPinToPort(_mosi);
mosi_reg = portModeRegister(mosi_port);
mosi_out = portOutputRegister(mosi_port);
miso_bit = digitalPinToBitMask(_miso);
miso_port = digitalPinToPort(_miso);
miso_reg = portModeRegister(miso_port);
miso_out = portOutputRegister(miso_port);
miso_in = portInputRegister(miso_port);
sck_bit = digitalPinToBitMask(_sck);
sck_port = digitalPinToPort(_sck);
sck_reg = portModeRegister(sck_port);
sck_out = portOutputRegister(sck_port);
}
[...]
If i try to read the MOSI port with *miso_in & miso_bit, i get no value only on Attiny85.
If i change my code by permutting the declaration beetween miso_out and miso_in, it works :
class TINYSPI {
public:
uint8_t mosi_bit;
uint8_t mosi_port;
volatile uint8_t *mosi_reg;
volatile uint8_t *mosi_out;
uint8_t miso_bit;
uint8_t miso_port;
volatile uint8_t *miso_reg;
volatile uint8_t *miso_in;
volatile uint8_t *miso_out;
uint8_t sck_bit;
uint8_t sck_port;
volatile uint8_t *sck_reg;
volatile uint8_t *sck_out;
[...]
So, i keep the first example and add another attribute for miso_in in another part of my code : "miso_in = portInputRegister(miso_port);" in case of problem on miso_out and ... it runs too.
Any idea why ?
(with some test, i should have 70B of free RAM while using that library)
Thx in advance,
regards,