MCP 3301 SPI haberleşme

Başlatan batuhann, 26 Mayıs 2018, 19:23:13

batuhann

Herkese selamlar. PIC18F4550 ile harici ADC entegresi olan MCP3301 ile SPI iletişim protokolünü kullanarak veri almaya çalışıyorum fakat bunu bir türlü başaramadım, Mikroc derleyicisinde yazmış olduğum kod ve kurduğum devre şu şekilde, yardımlarınızı bekliyorum, herkese iyi çalışmalar diliyorum.

sbit LCD_RS at RD2_bit;
sbit LCD_EN at RD3_bit;
sbit LCD_D4 at RD4_bit;
sbit LCD_D5 at RD5_bit;
sbit LCD_D6 at RD6_bit;
sbit LCD_D7 at RD7_bit;

sbit LCD_RS_Direction at TRISD2_bit;
sbit LCD_EN_Direction at TRISD3_bit;
sbit LCD_D4_Direction at TRISD4_bit;
sbit LCD_D5_Direction at TRISD5_bit;
sbit LCD_D6_Direction at TRISD6_bit;
sbit LCD_D7_Direction at TRISD7_bit;

char temp = 0;
char temp1 = 0;
int veri = 0;
int result = 0;
char text[7] = "      ";
char sign_bit = 0;

int ADC_Output() {
     BF_bit = 0;
     LATA.B5 = 0;                                 // Select ADC chip
     SPI1_Write(0x0000);
     while(BF_bit);                               // wait first 8 bit recieve
     temp = (SPI1_Read(SSPBUF) & 0b00011111);     // read first 8 bit
     SPI1_Write(0x0000);
     while(BF_bit);                               // wait second 8 bit recieve
     temp1 = SPI1_Read(SSPBUF);                   // read second 8 bit
     LATA.B5 = 1;                                 // Deselect ADC chip

     veri = (int)(temp << 8 | temp1);             // Combine 8 bits
     sign_bit = (char)veri>>12;
     if(sign_bit) veri *= -1;
     else veri *= 1;
     return veri;
}

void main() {
     ADCON0 = 0x00;
     ADCON1 = 0x0F;                            //
     CMCON  = 0x07;                            // Comparators are disabled

     TRISB.B0 = 1;                             // SDI pin is input
     TRISB.B1 = 0;                             // SCK pin is output
     TRISA.B5 = 0;                             // Slave select pin is output
     
     TRISD   = 0x00;
     LATA    = 0x00;
     LATB    = 0x00;
     LATC    = 0x00;
     LATD    = 0x00;
     LATA.B5 = 1;                              // Deselect ADC chip

     // *********SPI options**********

     SMP_bit = 1;                              // Input data sampled at end of data output time
     SSPBUF = 0;                               // SSPBUF is empty
     BF_bit = 0;                               // Receive not complete, SSPBUF is empty
     CKE_bit = 1;                              // Transmit occurs on transition from active to Idle clock state
     CKP_bit = 0;                              // Idle state for clock is a low level
     
     WCOL_bit = 0;                             // No collision
     SSPOV_bit = 0;                            // No overflow
     SSPEN_bit = 1;                            // Enables serial port and configures SCK, SDO, SDI and SS as serial port pins
     SSPM3_bit = 0;                            // SPI Master, CLK = Fosc/4
     SSPM2_bit = 0;
     SSPM1_bit = 0;
     SSPM0_bit = 0;

     SPI1_Init_Advanced(_SPI_MASTER_OSC_DIV4, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_HIGH_2_LOW);
     
     Lcd_Init();
     Lcd_Cmd(_LCD_CLEAR);
     Lcd_Cmd(_LCD_CURSOR_OFF);
     Lcd_Out(1,1,"MCP3301 ADC:");
     
     while(1){
          result = ADC_Output();
          IntToStr(result,text);
          Lcd_Out(2,1,text);
          delay_ms(20);
     }
}