Код
#define BIT(n) (1UL<<(n))
void SpiInitHW() {
//PIO
PINSEL3_bit.P1_20 = 3; //SCK0
FIO1CLR = BIT(20); //low
FIO1DIR_bit.P1_20 = 1; //output
PINMODE3_bit.P1_20 = 2; //no pull-up
PINSEL3_bit.P1_21 = 0; //PIO
FIO1SET = BIT(21); //high
FIO1DIR_bit.P1_21 = 1; //output
PINMODE3_bit.P1_21 = 2; //no pull-up
PINSEL3_bit.P1_23 = 3; //MISO0
FIO1DIR_bit.P1_23 = 0; //input
PINMODE3_bit.P1_23 = 0; //pull-up (вход выведен на разъём)
PINSEL3_bit.P1_24 = 3; //MOSI0
FIO1CLR = BIT(24); //low
FIO1DIR_bit.P1_24 = 1; //output
PINMODE3_bit.P1_24 = 2; //no pull-up
//SPI
PCLKSEL0_bit.PCLK_SPI = 1;
S0SPCCR = 0x80;
S0SPCR = BIT(5)/*MSTR*/;
}
void SpiSelect() {FIO1CLR = BIT(21);}
void SpiDeselect() {FIO1SET = BIT(21);}
INT8U SpiTransfer(INT8U data) {
S0SPDR = data;
while (!S0SPSR_bit.SPIF);
return S0SPDR;
}
//.................
for (;;) {
WAIT(signalSend); //ждем сигнала на передачу байта
SpiSelect();
SpiTransfer(mSend);
SpiDeselect();
}
void SpiInitHW() {
//PIO
PINSEL3_bit.P1_20 = 3; //SCK0
FIO1CLR = BIT(20); //low
FIO1DIR_bit.P1_20 = 1; //output
PINMODE3_bit.P1_20 = 2; //no pull-up
PINSEL3_bit.P1_21 = 0; //PIO
FIO1SET = BIT(21); //high
FIO1DIR_bit.P1_21 = 1; //output
PINMODE3_bit.P1_21 = 2; //no pull-up
PINSEL3_bit.P1_23 = 3; //MISO0
FIO1DIR_bit.P1_23 = 0; //input
PINMODE3_bit.P1_23 = 0; //pull-up (вход выведен на разъём)
PINSEL3_bit.P1_24 = 3; //MOSI0
FIO1CLR = BIT(24); //low
FIO1DIR_bit.P1_24 = 1; //output
PINMODE3_bit.P1_24 = 2; //no pull-up
//SPI
PCLKSEL0_bit.PCLK_SPI = 1;
S0SPCCR = 0x80;
S0SPCR = BIT(5)/*MSTR*/;
}
void SpiSelect() {FIO1CLR = BIT(21);}
void SpiDeselect() {FIO1SET = BIT(21);}
INT8U SpiTransfer(INT8U data) {
S0SPDR = data;
while (!S0SPSR_bit.SPIF);
return S0SPDR;
}
//.................
for (;;) {
WAIT(signalSend); //ждем сигнала на передачу байта
SpiSelect();
SpiTransfer(mSend);
SpiDeselect();
}
SSEL держит низкий уровень в течение байтового интервала, как задумано; на SCK и MOSI - молчание.
Что здесь не так?