Witam.
Piszę procedurę obsługi SPI w Atmedze. W pewnym momencie oczywiście trzeba sprawdzić flagę, czy dana się wysłała. Jednak symulator nie generuje tego przerwania. Czy tak już ma symulator? Z Helpa wyczytałem, że jest symulacja SPI i przerwań, u mnie nic się nie zmienia.
Oczywiście mam ustawione globalne przerwania i te od SPI.
Oto kod:
Piszę procedurę obsługi SPI w Atmedze. W pewnym momencie oczywiście trzeba sprawdzić flagę, czy dana się wysłała. Jednak symulator nie generuje tego przerwania. Czy tak już ma symulator? Z Helpa wyczytałem, że jest symulacja SPI i przerwań, u mnie nic się nie zmienia.
Oczywiście mam ustawione globalne przerwania i te od SPI.
Oto kod:
#include <io.h>
#include <MCP23S17.h>
#include <interrupt.h>
#define SS_NISKI() (PORTB &= ~0x01); //stan niski na SS
#define SS_WYSOKI() (PORTB |= 0x01); //stan wysoki na SS
#define ADRES 0x02; //adres A0=1, A1=A2=0
void spi_init(void)
{
SPCR = _BV(SPE) | _BV(MSTR) | _BV(SPIE); //tryb nadrzedny, predkosc 4MHz, wlaczenie SPI, big endian, wlaczenie przerwania
DDRB |= 0b00000111; //ustawienie kierunku bitow portu
SS_WYSOKI(); //stan wysoki na SS
}
void spi_wyslij(char dana)
{
SPSR |= (1 << SPIF);
SPDR = dana;
while(!(SPSR & (1<<SPIF)));
}
void mcp23s17_zapisz(unsigned char rejestr, unsigned char dana)
{
SS_NISKI();
spi_wyslij(0x02 | 0x01 | 0x40);
spi_wyslij(rejestr);
spi_wyslij(dana);
SS_WYSOKI();
}
void main(void)
{
sei();
spi_init();
mcp23s17_zapisz(IOCONB, 0b00001000);
mcp23s17_zapisz(IOCONB, 0xFF);
mcp23s17_zapisz(GPIOB, 0b00000010);
}