Digitālo potenciometru vadība, izmantojot SPI saskarni

Šoreiz autors aplūko digitālo potenciometru vadības iespējas, izmantojot SPI saskarni.

1.1.att. Digitālo potenciometru vadība, izmantojot SPI saskarni


Vispārīgā gadījumā SPI saskarnei nepieciešams izmantot četras mikrokontrollera pieslēgvietas, ja nepieciešams nodrošināt datu nosūtīšanu un saņemšanu, piemēram, no termosensora. Datu pārsūtīšanas laikā izvēlētās ierīces jeb perifērijas (SS - slave select vai CSchip select) pieslēgvietai ir jābūt zemā loģiskajā līmenī, bet tad, kad datu pārsūtīšana ir pabeigta, augstā loģiskajā līmenī, taču ir gadījumi, kad nepieciešams otrs variants, proti, lai uzsāktu, jāpadod augsts signāla līmenis, lai pārtrauktu, jāpadod zems signāla līmenis, kas nozīmē to, ka vienmēr nepieciešams iepazīties ar perifērijas jeb ierīces datu lapu. Takts signāla nodrošināšanai tiek izmantota SCK līnija, bet vēl divas līnijas tiek izmantotas datu nosūtīšanai (MOSI) un datu saņemšanai (MISO). Lai varētu nodrošināt saziņu ar vairākām ierīcēm, nepieciešams izmantot vairākas perifēriju izvēles pieslēgvietas (SS vai CS).

1.2.att. SPI saskarnes signālu diagramma






#define F_CPU 8000000UL

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MOSI 3
#define MISO 4
#define SCK 5
#define SS1 2
#define SS2 1


void SPI_Init();
void SPI_SS_Enable();
void SPI_SS_Disable();
unsigned char SPI_Read();
void SPI_Write(unsigned char write_data);
void SET_V_POT1(unsigned char value, unsigned char address);
void SET_V_POT2(unsigned char value, unsigned char address);


int main(void){

DDRD = 0xFF;
DDRC = 0x00;

SPI_Init();
_delay_ms(20);

while(1){

for(int i=127; i>=0; i--){
SET_V_POT1(i, 0x00);
_delay_ms(100);
SET_V_POT2(0x40, 0x00);
}

SET_V_POT2(0xFF, 0x00);

_delay_ms(1000);
}
return 0;
}

//======================================================================//

void SPI_Init(){

DDRB = (1<<MOSI)|(1<<SCK)|(1<<SS1)|(1<<SS2);
DDRB &= ~(1<<MISO);
PORTB |= (1<<SS1)|(1<<SS2);
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);

}



void SPI_SS1_Enable(){

PORTB &= ~(1<<SS1);

}

void SPI_SS1_Disable(){

PORTB |= (1<<SS1);

}

void SPI_SS2_Enable(){

PORTB &= ~(1<<SS2);

}

void SPI_SS2_Disable(){

PORTB |= (1<<SS2);

}

unsigned char SPI_Read(){

SPDR = 0xFF;
while(!(SPSR & (1<<SPIF)));
return(SPDR);

}

void SPI_Write(unsigned char write_data){

SPDR = write_data;
while(!(SPSR & (1<<SPIF)));

}

//======================================================================//
void SET_V_POT1(unsigned char value, unsigned char address){

/* Funkcija sprieguma iestatīšanai*/

SPI_SS1_Enable();
SPI_Write(address);
SPI_Write(value);
SPI_SS1_Disable();

}
//======================================================================//
void SET_V_POT2(unsigned char value, unsigned char address){

/* Funkcija sprieguma iestatīšanai*/

SPI_SS2_Enable();
SPI_Write(address);
SPI_Write(value);
SPI_SS2_Disable();

}
//======================================================================//






UZ SĀKUMU