Проблемма чтения с использования spi мой алгоритм 1 Ставлю CSN(ss) в HIGH 2 инициализирую spi 3 Ставлю CSN(ss) в low !!!4 начинаю передачу команды чтения регистра ( вот здесь проблемма независима от регистра после окончания передачи имеется 1110000) 5 пауза 1 мкс 6 Ставлю CSN(ss) в HIGH 7 выключаю spi 8 вывожу результат *библиотека nrf работает нормально передача есть использую пины : // SPI PIN // #define MiSO 11 // SPI Serial Output #define MOSI 12 // SPI Serial Input #define CE 9 // TX ModeHigh Pulse > 10μs |RX Mode High | Standby Modes Low #define CSN 10 //SPI Chip Select, active low #define SCK 13 // SPI Clock Код (C++): #include <Arduino.h> #include "SPI.h" #include "nRF24L01.h" // тут только map регистров SPISettings SetupSpi(4000000, LSBFIRST, SPI_MODE0); void setup() { pinMode(CSN, OUTPUT); digitalWrite(CSN, HIGH); byte In=0; byte In1=0; Serial.begin(9600); //set baud rate to 115200 for usart SPDR=0; SPI.begin (); SPDR=NRF_CONFIG; digitalWrite(CSN, LOW); SPI.beginTransaction(SetupSpi); SPI.transfer(FIFO_STATUS); In=SPDR; delayMicroseconds(1); In1=SPDR; digitalWrite(CSN, HIGH); SPI.endTransaction(); In1=SPDR; Serial.println(SPDR,BIN); // print as a raw byte value Serial.print(NRF_CONFIG,BIN); // print as a raw byte value SPI.end(); } void loop() { }
Поясните, пожалуйста. К кому эта команда обращена? Может засмеют, в даташит не хочется лезть, что в регистре SPDR? У вас к spi шине подключено устройство? Если не вдаваться в подробности подключаемого устройства, и верить, что вы делаете все правильно, т.е. устройство отвечает сразу. То вам нужно посмотреть на то, что возвращает spi.transfer. answer=spi.transfer(ask) На этом форуме я делал ацп ad7714 подглядите там. Я специально слал заглушку "0хFF", чтобы во время передачи получать данные. Что делает задержка в 1мкс?
SPDR- регистор мк atmega328( он равен на стороне master-- answer=spi.transfer(FIFO_STATUS) , тоесть answer=SPDR). Использовал , delayMicroseconds(1); думал дело в задержке . FIFO_STATUS- команда чтения регистра статуса fifo (ещё читал статус 0x00 точно также ) сама команда выглядит 0b000A AAAA где А регистр который читать .
чтобы считать данные, нужно их запросить. После этого нужно тактировать sck чтобы получить ответ. При этом помнить, что spi.transfer работает только с байтами. Псевдокод: Код (C++): spi.transfer(запрос данных регистра А) uint8_t ans1=spi.transfer(0xff) uint8_t ans2=spi.transfer(0xff) uint16_t ans=ans1<<8 | ans2 1 мкс погоду не сделает, у вас spi на частоте 4 МГц, да и в ардуино все реализовано последовательно, пока не отправит она не перейдёт к следующей операции.
В абдурино может быть, а у нормальных программистов отправка через USART работает независимо от программы. Окончание отправки сигнализируется флагами и прерываеиями.