带寄存器的 Arduino Uno SPI

Posted

技术标签:

【中文标题】带寄存器的 Arduino Uno SPI【英文标题】:Arduino Uno SPI with registers 【发布时间】: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))) ;

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

【问题讨论】:

如果你尝试重写现有代码,你应该先“窥探”现有的开源内容。 我认为您不想在中断关闭的情况下使用串行代码。 【参考方案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

【讨论】:

以上是关于带寄存器的 Arduino Uno SPI的主要内容,如果未能解决你的问题,请参考以下文章

在线仿真Arduino UNO+74HC595流水灯 + 按键控制

在线仿真Arduino UNO+74HC595流水灯 + 按键控制

Arduino UNO 利用74HC164循环显示(0-F)

Arduino UNO学习74HC595使用,循序渐进过程

Arduino UNO +74HC164流水灯示例

Arduino UNO驱动合宙1.8‘TFT SPI屏幕示例演示(含资料包)