День добрый!
Подниму тему ибо уже неделю бьюсь и не могу победить. Тоже ADuc7021, тоже проблема с SPI. Причем уже передавать пытаюсь банальный алфавит, но на приемной стороне его нет, а только нули, нули... Это проверено осциллографом. Вот код:
Код
// SPISTA (p.70)
#define SPIRX_OVF (SPISTA & (1<<5))
#define SPIRX_IRQ (SPISTA & (1<<4))
#define SPIRX_FULL (SPISTA & (1<<3))
#define SPITX_UDF (SPISTA & (1<<2))
#define SPITX_IRQ (SPISTA & (1<<1))
#define SPITX_EMPTY (!(SPISTA & (1)))
// SPICON (p.70)
#define SPI_CONTINUOUS_TX (1UL << 12)
#define SPI_LOOPBACK (1UL << 11)
#define SPI_SO_EN (1UL << 10)
#define SPI_SLAVE_SELECT_EN (1UL << 9)
#define SPI_RXOVF_OVERWRITE (1UL << 8)
#define SPI_TXUDF_SENDZERO (1UL << 7)
#define SPI_TXWRITE_TRANS (1UL << 6)
#define SPI_LSB_FIRST (1UL << 5)
#define SPI_CLK_IDLEHIGH (1UL << 3)
#define SPI_PHASE (1UL << 2)
#define SPI_MASTER_MODE (1UL << 1)
#define SPI_ENABLE (1UL << 0)
#define SPI_BITRATE 1000000LL
#define SPI_MODE (SPI_TXWRITE_TRANS | SPI_SO_EN | SPI_ENABLE \
| SPI_TXUDF_SENDZERO | SPI_CONTINUOUS_TX)
#ifndef SPI_BITRATE
#define SPI_BITRATE 100000LL
#endif
#define SPI_DIVISOR (((41779200LL/2)/SPI_BITRATE)-1)
#if (SPI_DIVISOR >= 0xFE)
#error "Bad SPI_BITRATE value! Look p.69 datasheet."
#endif
#ifndef SPI_MODE
#error "SPI_MODE not defined!"
#endif
uint8_t spidata[SPI_N]; // буфер выходных данных SPI
void SPI_Init(void)
{
SPICON = SPI_MODE;
SPIDIV = SPI_DIVISOR;
#if (SPI_MODE&SPI_MASTER_MODE)
dir_out(SPI_SCK);
dir_out(SPI_MOSI);
dir_in(SPI_MISO);
GP1CON &= ~(0x0FFF0000); GP1CON |= 0x02220000; // выбрали функцию GPIO как SPI
#else // (SPI_MODE&SPI_MASTER_MODE)
dir_in(SPI_SCK);
dir_in(SPI_MOSI);
dir_out(SPI_MISO);
dir_in(SPI_CS);
GP1CON &= ~(0xFFFF0000); GP1CON |= 0x22220000; // выбрали функцию GPIO как SPI
#endif //(SPI_MODE&SPI_MASTER_MODE)
}
__inline void SPI_StartIRQTX(void)
{
spitxcount = 0;
SPITX = spidata[spitxcount++];
IRQEN = SPI_SLAVE_BIT;
on(Req); // сигнал что данные готовы - когда мастер его видит - он выставляет SlaveSelect и читает данные.
}
void SPI_Ready_ISR(void)
{
SPITX = spidata[spitxcount++];
if(spitxcount>=SPI_N)
{
IRQCLR = SPI_SLAVE_BIT;
off(Req);
if(AdcBufRdy_flag) ADC_Start();
}
}
void main(void){
...
SPI_Init();
...
while(1) // вечный цикл
{
while(spitxcount < SPI_N); // Ждем окончания передачи предыдущих байт..
spidata[0] = 'A'; spidata[1] = 'B'; spidata[2] = 'C'; spidata[3] = 'D';
spidata[4] = 'E'; spidata[5] = 'F'; spidata[6] = 'G'; spidata[7] = 'H';
SPI_StartIRQTX(); // запускаем передачу данных на фоне
}
}
Если убрать из режима SPI_TXUDF_SENDZERO (передача нуля если передающий регистр не готов), то шлет не нули а всякую чушь. Тоесть на лицо Underflow (передающий регистр не готов). А почему оно так - непойму.