Arduino Uno SPI с регистрами - PullRequest
0 голосов
/ 06 июля 2019

Я пытаюсь активировать SPI непосредственно из регистров.

Я использую Arduino Uno с ATMEGA328P с этим кодом:

void setup() {
  // put your setup code here, to run once:
  cli();
  Serial.begin(9600);
  SPI_MasterInit();
  sei();
}

void loop() {
  // put your main code here, to run repeatedly:
  SPI_MasterTransmit(10);
}

void SPI_MasterInit(void)
{
  int spcr;
  /* Set MOSI and SCK output, all others input */
  DDRB = (1 << DDB3) | (1 << DDB5);
  /* Enable SPI, Master, set clock rate fck/16 */
  SPCR = (1 << SPE) | (1 << MSTR) | (1 << SPIE);
  spcr = SPCR;
  Serial.println(SPCR, BIN);
}

void SPI_MasterTransmit(char cData) {
  /* Start transmission */
  SPDR = cData;
  /* Wait for transmission complete */
  while (!(SPSR & (1 << SPIF))){
    Serial.println(SPSR, BIN); // stuck here
  }
}

и застрял в функции SPI_MasterTransmit.

передача никогда не заканчивается.

помогите кому-нибудь?

РЕДАКТИРОВАТЬ:

Я изменяю код на это:

void setup() {
  sei();
  Serial.begin(9600);
  SPI_MasterInit();
}

void loop() {
  SPI_MasterTransmit("A");
  Serial.println("pass transmit");
}

void SPI_MasterInit(void)
{
  /* Set MOSI and SCK output, all others input */
  DDRB = (1 << DDB3) | (1 << DDB5);
  /* Enable SPI, Master, set clock rate fck/16 */
  SPCR = (1 << SPE) | (1 << MSTR);
}

void SPI_MasterTransmit(char cData) {
  /* Start transmission */
  SPDR = cData;
  /* Wait for transmission complete */
  while (!(SPSR & (1 << SPIF))) ;
}

и «пройти передачу» напечатано только один раз.

1 Ответ

0 голосов
/ 08 июля 2019

Проблема была с портом SS после того, как я добавил элемент управления SS внутрь

SPI_MasterInit () и SPI_MasterTransmit () это работало

новый код:

void setup() {
  sei();
  Serial.begin(9600);
  SPI_MasterInit();
}

void loop() {
  SPI_MasterTransmit("A");
  Serial.println("pass transmit");
}

void SPI_MasterInit(void)
{
  /* Set MOSI and SCK output, all others input */
  DDRB = (1 << DDB3) | (1 << DDB5);
  PORTB |= (1 << PORT2); //set SS
  /* Enable SPI, Master, set clock rate fck/4 */
  SPCR = (1 << SPE) | (1 << MSTR);
}

void SPI_MasterTransmit(char cData) {
  /* Unset SS */
  PORTB |= (0 << PORT2);
  /* Start transmission */
  SPDR = cData;
  /* Wait for transmission complete */
  while (!(SPSR & (1 << SPIF))) ;
  PORTB |= (1 << PORT2); //set SS
}
...