带寄存器的 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流水灯 + 按键控制