Tuesday, July 14, 2020

ATMega32 SPI master and slave mode

ATMega32 SPI master and slave mode Programming and interfacing

ATMega32 AVR Working In Slave Mode

In the previous post we introduced only the SPI master mode. In slave mode, SPI module is more easier to implement. In this example, I use one master ATMega32 to send a counting data to another slave ATMega32.

In slave mode, the ATMega32 must configured as follow:
  1. Set MISO pin to output
  2. Since it's in slave mode by default, we just enable the SPI module to make it work.
  3. For the data reception, we must wait until the SPIF of SPSR register is cleared.
  4. Finally, we just read the data buffer from the  SPDR register.
ATMega32 SPI master and slave mode
At master, ATMega32 counts the input from a switch and send out the result to the slave
ATMega32. At the slave side, ATMega32 just receive the data and output to the SSD.

In Atmel Studio 7, I use one solution with two projects, a master project and a slave project.

ATMega32 SPI master and slave mode
SPI Master and Slave Solution

ATMega32 Master Mode In C

For master source code in the master project:

#include <avr/io.h>

void masterInit(void){
/*Set MOSI, SCK and SS Output*/
DDRB=(1<<5)|(1<<7)|(1<<4);
/*Enable SPI Master set clock rate fck/4*/
SPCR=(1<<SPE)|(1<<MSTR);
}

void masterTransmit(char spiData){
/*Start the transmission*/
SPDR=spiData;
/*Wait for completion*/
while(!(SPSR&(1<<SPIF)));
}

int main(void)
{
    unsigned char ssd[16]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,
    0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
char cnt=0;
masterInit();
/*PIND2 inputs counting*/
DDRD&=~(1<<2);
/*TURN ON PULLUPS FOR PIND2*/
PORTD=0x04;

/*Initiate a starting transmission*/
PORTB&=~(1<<4);
masterTransmit(ssd[cnt]);
PORTB|=(1<<4);
    while (1) 
    {
if((PIND&0x04)==0){
while((PIND&0x04)==0);
cnt+=1;
if(cnt>15) cnt=0;
PORTB&=~(1<<4);
masterTransmit(ssd[cnt]);
PORTB|=(1<<4);
}
    }
}

ATMega32 Slave Mode In C

For Slave source code in the Slave project:

#include <avr/io.h>

void slaveInit(void){
/*Set MISO to input*/
DDRB=(1<<6);
/*Turn On SPI*/
SPCR=(1<<SPE);
}

char spiReceive(void){
/*Wait for completed received data*/
while(!(SPSR&(1<<SPIF)));
/*Return the SPI Buffer*/
return SPDR;
}

The full schematic is here.

ATMega32 SPI master and slave mode
Schematic Diagram




If you want a standard PCB for ATMega32 micro-controller, you can order my AVR Microcontroller project from PCBWay with a reasonable price. Click here to get a free $5 credit for new account.


1 comment:

Search This Blog

Labels

25AA010A (1) 8051 (7) 93AA46B (1) ADC (30) Analog Comparator (1) Arduino (15) ARM (6) AT89C52 (7) ATMega32 (56) AVR (57) CCS PICC (28) DAC (1) DHT11 (2) Display (105) Distance Sensor (3) DS18B20 (3) dsPIC (2) dsPIC30F1010 (2) EEPROM (5) Environment Sensor (4) esp8266 (1) I2C (29) Input/Output (67) Interrupt (19) Keil (5) Keypad (10) LCD (47) Master/Slave (1) MAX7221 (1) MCP23017 (5) MCP23S17 (4) Meter (3) MikroC (2) Motor (15) MPLABX (71) Nokia 5110 LCD (3) OLED (2) One-Wire (6) Oscillator (8) PCB (6) PCD8544 (3) PCF8574 (5) PIC (107) PIC12F (2) PIC16F628A (2) PIC16F630 (1) PIC16F716 (3) PIC16F818 (10) PIC16F818/819 (2) PIC16F84A (15) PIC16F876A (1) PIC16F877A (9) PIC16F88 (1) PIC16F887 (60) PIC18 (19) PIC18F1220 (4) PIC18F2550 (3) PIC18F4550 (12) PWM (11) RTC (8) Sensor (10) SH1106 (1) Shift Register (11) Shift Registers (3) SPI (24) STM32 (6) STM32 Blue Pill (6) STM32CubeIDE (6) STM32F103C8T6 (6) SysTick (3) temperature sensor (11) Thermometer (21) Timer/Counter (31) TM1637 (2) UART (7) Ultrasonic (4) Voltmeter (7) WDT (1) XC16 (2) XC8 (94)