【发布时间】: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))) ;
}
并且“通过传输”只打印一次。
【问题讨论】:
-
如果你尝试重写现有代码,你应该先“窥探”现有的开源内容。
-
我认为您不想在中断关闭的情况下使用串行代码。