【问题标题】:Arduino Uno SPI with registers带寄存器的 Arduino Uno SPI
【发布时间】:2019-07-06 18:37:58
【问题描述】:

我正在尝试直接从寄存器激活 SPI。

我正在使用带有 ATMEGA328P 的 Arduino Uno 使用此代码:

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))) ;
}

并且“通过传输”只打印一次。

【问题讨论】:

  • 如果你尝试重写现有代码,你应该先“窥探”现有的开源内容。
  • 我认为您不想在中断关闭的情况下使用串行代码。

标签: arduino spi atmel


【解决方案1】:

问题出在我在里面添加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
}

【讨论】:

    猜你喜欢
    • 2023-01-11
    • 1970-01-01
    • 2014-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-22
    • 1970-01-01
    • 2021-06-17
    相关资源
    最近更新 更多