MCP2510 SPI ile registere yazma problemi.

Başlatan forsa1975, 16 Eylül 2021, 09:25:13

forsa1975

MCP2510  için CNF1 , CNF2 ve CNF3  değerlerini değiştirmem gerekiyor. ex_can_css.c  dosyasını çalış derleyip yükledim. başlangıçta can_init fonksiyonu çalışyor. Lojik analizör ile CNF1 , CNF2 ve CNF3 adreslerine yazıldığını görüyorum. Fakat okunduğunda daha önce yazılmış olan değerleri okumuyor. Burada göremediğim bir nokta olmalı. 




//ex_can_css.c

#include <18F46k22.h> 
#device ADC=16  // 10 bitlik ADC 

#fuses HSH,PLLEN,PUT,PROTECT,NOLVP,NOBROWNOUT,WDT1024,NOPBADEN,NOMCLR,NOXINST,NOFCMEN //,STVREN //,WDT1024,

#use delay(crystal=16000000hz,clock=64000000)

#byte RCSTA2 = getenv("sfr:RCSTA2")
#byte BAUDCON2 = getenv("sfr:BAUDCON2")
#byte RCREG2 = getenv("sfr:RCREG2")
#use I2C(master, sda=PIN_D1, scl=PIN_D0, FAST=50000)

#use rs232(baud=38400, xmit=PIN_D6, rcv=PIN_D7)

#define CAN_DO_DEBUG TRUE  //FALSE

#define EXT_CAN_CS   PIN_B2
#define EXT_CAN_SI   PIN_C5
#define EXT_CAN_SO   PIN_C4
#define EXT_CAN_SCK  PIN_C3
#define EXT_CAN_RESET   PIN_B3

#define BOARD1_ID  24
#define BOARD2_ID  25
#define LED     PIN_B4  //LED 


#include "can-mcp251x.c"

static unsigned char ch;
static int1 temp_flag=0;
unsigned int16 sayac1=0,sayac2=0;

#int_timer3
void Timer3()
{
  sayac1=sayac1+1;
  sayac2=sayac2+1;
  set_timer3(60544);//60544  // 2.5 ms
}


#INT_RDA
void RS232_Handler()
{
    ch = getch();
   
   temp_flag=1;   
}

void mcp_yaz()
  {
    mcp2510_write(0x2A,0x00);
    delay_us(10);
    mcp2510_write(0x29,0xB4);
    delay_us(10);
    mcp2510_write(0x28,0x06);
    delay_us(10);
  }

 void mcp_oku()
       {
       mcp2510_read(0x2A);
       delay_us(10);
       mcp2510_read(0x29);
        delay_us(10);
       mcp2510_read(0x28);
       delay_ms(10);
       sayac1=0;
       }

void main(void)
{
   
   struct rx_stat rxstat;
   int32 rx_id;
   int8 rx_len;               
   int8 buffer[8];
   
   set_tris_a(0b00000000);
   set_tris_b(0b00000000);
   set_tris_c(0b10010000);
   set_tris_d(0b10000000);
   set_tris_e(0b00000000);
   
   output_low(EXT_CAN_RESET);
   delay_ms(1);
   output_high(EXT_CAN_RESET);
   //setup_spi(SPI_MASTER | SPI_L_TO_H | SPI_CLK_DIV_4 | SPI_SAMPLE_AT_END); // SSPCON=00100001,SSPSTAT=1000000
   setup_timer_3(T3_INTERNAL | T3_DIV_BY_8);
   set_timer3(65136);
   enable_interrupts(int_timer3);
   
   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);
   output_high(LED);
   puts("Can Sample");
   can_init();
   puts("Init Completed");
   output_low(LED);
   output_low(ROLE1);
   output_low(ROLE2);
   output_low(ROLE3);
   output_low(ROLE4);
   output_high(ARIZA);
   
   output_low(EXT_CAN_RESET);
   delay_ms(1);
   output_high(EXT_CAN_RESET);
   
   delay_ms(100); // okuma yazmayı test etmek için 
   mcp_yaz();
   delay_ms(100);
   mcp_oku();  

   while(TRUE)
     {
      
          if(can_kbhit())
           {
                         // If so, get the message.
                         
                         //printf("%lu %u %u");
               if(can_getd(rx_id, buffer, rx_len, rxstat))
              {
                       //output_toggle(LED);  
                  if(rx_id == BOARD1_ID)  // Is it for this board ?
                    {
                     puts("Data Rcvd Node-2");
                    }
              }
          
         }

     }
}



Şemada SPI dışındaki bağlantılarda farkllıklar var. SPI bağlanmtısı aynıdır.


dumansiz

Olmayan şeyi anlamadım ama, eğer logic analyzer'da görebildiğiniz veriyi "can paketi" olarak alamıyorsanız, 120 ohm direncin hatta takılı olup olmadığını kontrol edin.

forsa1975

Alıntı yapılan: dumansiz - 16 Eylül 2021, 13:21:50Olmayan şeyi anlamadım ama, eğer logic analyzer'da görebildiğiniz veriyi "can paketi" olarak alamıyorsanız, 120 ohm direncin hatta takılı olup olmadığını kontrol edin.

Daha oraya gelemedim hocam.  :-[    MCP2510 da konfigrasyonun yapılamamasına takıldım, kaldım.