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ı.
(https://i.ibb.co/9pjMW8C/Ads-z.png) (https://ibb.co/9pjMW8C)
//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");
}
}
}
}
}
(https://pic-microcontroller.com/wp-content/uploads/2015/10/Connect-CAN-SPI-with-PIC-Controller-schematich.jpg)
Şemada SPI dışındaki bağlantılarda farkllıklar var. SPI bağlanmtısı aynıdır.
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.
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.