Znalazłem kod obsługujący mcp41100, wszystko rozumiem, ale po co w kodzie występują funkcje NOP, i z czego wynika ich ilość w kodzie. Rozumiem że realizują one opóźnienia.
include <avr/io.h>
#include <util/delay.h>
#define DDR_SI DDRD //wejście SI
#define PORT_SI PORTD
#define SI PD5
#define DDR_CS DDRD //sygnał CS
#define PORT_CS PORTD
#define CS PD7
#define DDR_SCK DDRD //wyjście zegarowe
#define PORT_SCK PORTD
#define SCK PD6
void spi_init(void)
{
DDR_SI |= _BV(SI); //konfiguracja pinu jako wyjście SI
DDR_SCK |= _BV(SCK); //konfiguracja pinu jako wyjście zegarowe
PORT_SCK &= ~_BV(SCK); // ustawia SCK w stan niski
DDR_CS |= _BV(CS); //konfiguracja pinu jako wyjście CS
PORT_CS |= _BV(CS); //ustaw CS w stan wysoki
}
void spi_write(unsigned int cmd)
{
unsigned int pot = 0;
pot = cmd;
PORT_CS &= ~_BV(CS); //CS niski, zezwolenie na transmisję
__asm("nop");
__asm("nop");
__asm("nop");
__asm("nop");
for (int i=0; i<16; i++)
{
if( pot & 0x80) PORT_SI |= _BV(SI);
else PORT_SI &= ~_BV(SI);
PORT_SCK |= _BV(SCK);
__asm("nop");
__asm("nop");
__asm("nop");
__asm("nop");
pot = pot << 1;
PORT_SCK &= ~_BV(SCK);
__asm("nop");
__asm("nop");
__asm("nop");
__asm("nop");
}
PORT_CS |= _BV(CS);
}
int main(void)
{
spi_init();
spi_write(0b0001000111111111);
}