SPI slaveden bilgi gönderme

Başlatan powerelectronic, 06 Nisan 2014, 21:18:09

powerelectronic

Merhaba, 3tane 877A kullandım ve master olan spidan slavelere bilgi gönderdim ancak slave chipden bilgi göndermeyi beceremedim. Bu yapmak için bir durum registeri filan mı takip etmem gerek?

spi.h
extern void spi_init(void);//0:Master 1:Slave
extern void spi_write(unsigned char data);
extern unsigned char spi_read(void);
unsigned char tip=0;


spi.c
#include "spi.h"
#include <pic16f877a.h>


void spi_init(void)
{
    if(tip==0)
    {
        SSPSTAT=0b10000000;
        SSPCON=0b00100010;
    }
    else
    {
        SSPSTAT=0b00000000;
        SSPCON=0b00100100;
    }
   
}

void spi_write(unsigned char data)
{
    SSPBUF = data;
    while(!BF);
}
 unsigned char spi_read(void)
 {
     while(!BF);
     return SSPBUF;
 }



main de okumayı şöle yapıyorum.

while(1)
    {
        RA1=0; //istediğim chipin ss'ini 0 yapıyorum.
        if(spi_read()==1){lcd_metin("tus:1");}
        RA1=1;//istediğim chipin ss'ini 1 yapıyorum.
        RA1=0;//istediğim chipin ss'ini 0 yapıyorum.
        if(spi_read()==2){lcd_metin("tus:2");}
        RA1=1;//istediğim chipin ss'ini 1 yapıyorum.
        RA1=0;//istediğim chipin ss'ini 0 yapıyorum.
        if(spi_read()==3){lcd_metin("tus:3");}
        RA1=1;//istediğim chipin ss'ini 1 yapıyorum.
    }
Çalışan kazanır.

Kabil ATICI

#1
Normalde slave konumundaki spi eğer spi data registerindeki bilgiyi sürekli güncel tutuyorsa, master slave bir bilgi gönderirken, slavedeki bilgide master'a gelir. (MISO, MOSI)

Ama slave bilgiyi sürekli güncel tutmazsa, önce slave bilgiyi yazması için bir kod gönderirsin, örneğin 0x01 gibi. Biraz süre verirsin sonra tekrar spi iletişimi yaptırırsın. örneğin ikincisinde master 0xff gönderir.

Ek:
Slave bölümünde SPI iletişim olduğunu algılamak için  kesme kullanabilirsin. Böylece SPI data registerini sürekli kontrol etmene gerek kalmaz.
ambar7