SPI 24 Bit haberleşme sorunu (PIC ve ayrıca CS5460A)

salihonur

Üye
Katılım
7 Ağu 2008
Mesajlar
78
Puanları
1
Yaş
37
Arkadaşlar, projenin bir bölmünde 24 bitlik ADC'den SPI protokolünü kullanarak veri okumam gerekiyor.

Bunun için 2 adet PIC18F2520'yi SPI ile bağladım. 1. picte buton1'e tıkladığımda SPI'ya 0xFFFFFC, 2. butona basıldığında ise 0xFFFFFF verisi basılıyor. SPI 8 bit veri taşıdığından doğal olarak 3'e bölüp diğer tarafta birleştiriyorum. 2. pice bağlı olan led ise 0xFFFFFC verisi geldiğinde logic 1 aksi halde logic 0 oluyor. Kodlar aşağıdaki gibidir.

CCS KODLAR
Kod:
#include <18F2520.h>
 
#use delay(clock=32000000, restart_wdt)
#fuses NOMCLR,WDT,WDT8,NOBROWNOUT,PUT,NOLVP,CPB,CPD,PROTECT,NOWRT
 
#use    rs232(BAUD=9600,XMIT=PIN_C6,RCV=PIN_C7,ENABLE=PIN_C5,PARITY=N,ERRORS)
 
//#use SPI(
//   DO = PIN_C5,
//   DI = PIN_C4,
//   CLK = PIN_A5,
//   baud = 9600,
//   BITS = 24,
//   LSB_FIRST,
//   SAMPLE_RISE,
//   stream = SPI_PORT0
//)
 
// Port ve Pin Tanımlamaları ===================================================
#byte   PORTA                   = 0xF80
#byte   PORTB                   = 0xF81
#byte   PORTC                   = 0xF82
 
#bit    CS                              = PORTA.5
 
#bit    SECIM_1                 = PORTA.0
#bit    SECIM_2                 = PORTA.1
#bit    BUZZER                  = PORTC.0
 
#define DEVICE 2
 
void main(void)
{
        int16 k;
        int i,x;
        int32 data,rc_data;
        //---------------------------------------------------------------------------
        setup_oscillator(OSC_32MHZ);
      
        restart_wdt();
        set_tris_a(0x0F);
        set_tris_b(0xFF);
        set_tris_c(0x00);
      
        enable_interrupts(global);
        enable_interrupts(int_rda);
restart_wdt();
 
      
        PORTA = 0;
        PORTB = 0;
        PORTC = 0;
      
        #if DEVICE==1
                SETUP_SPI(SPI_MASTER | SPI_CLK_DIV_4);
        #else
                SETUP_SPI(SPI_SLAVE | SPI_CLK_DIV_4);
        #endif
//      disable_interrupts(GLOBAL);
        restart_wdt();
      
        while(1)
        {
                #if DEVICE==1
                        if(SECIM_1)
                                data=0xFFFFFC;
                        else if(SECIM_2)
                                data=0xFFFFFF;
                        else
                                data=0x000000;
                      
                        x=data;
                        spi_write(x);
                        data=data>>8;
                        x=data;
                        spi_write(x);
                        data=data>>8;
                        x=data;
                        spi_write(x);
//                      spi_write(data);
                      
                #else
              
//                      rc_data = spi_read();
                        k++;
                        if(k>65534)
                        {
                        rc_data=0;
                        x=spi_read(0);
                        rc_data=x;
                        x=spi_read(0);
                        rc_data=rc_data<<8;
                        rc_data|=x;
                        x=spi_read(0);
                        rc_data=rc_data<<8;
                        rc_data|=x;
                        }
                      
                        if(rc_data==0xFFFFFC)
                                BUZZER=1;
                        else
                                BUZZER=0;
              
                #endif
                restart_wdt();
        }
}

Ancak burada ters giden birşeyler var. Buton1'e sürekli basılmasına rağmen her daim doğru veri okunmuyor. Led bazen yanıyor bazen sönüyor.

Yanlış yaptığım yer neresidir? CS5460A 24 bit ADC konusunda fikir verebilecek var mı?
 

Forum istatistikleri

Konular
128,158
Mesajlar
915,531
Kullanıcılar
449,907
Son üye
ayse.krcsarge

Yeni konular

Geri
Üst