Я пытаюсь активировать 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))) ;
}
и «пройти передачу» напечатано только один раз.