Thông báo

Collapse
No announcement yet.

Đồ án giao tiếp CAN - Cần giúp đỡ

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Đồ án giao tiếp CAN - Cần giúp đỡ

    Em đang làm đồ án về giao tiếp can cần được giúp đỡ về lập trình.
    Về phần cứng thì em có mạch gồm PIC6F887 + MCP2515 + MCP2551 và LCD hiển thị (Sơ đồ mạch trong file CAN Demo.pdf đính kèm)


    Về code thì em viết như sau:

    Code:
    Code:
    #include <htc.h>
    #include <stdlib.h>
    #include <ctype.h>
    #include "LCD.c"
    #include "MCP2515.c"
    #include "MCP2515.h"
    
    #define _XTAL_FREQ	20000000
    
    __CONFIG ( FOSC_HS & WDTE_OFF & PWRTE_OFF & MCLRE_ON & CP_OFF & CPD_OFF & BOREN_OFF & IESO_OFF & FCMEN_ON & LVP_OFF & DEBUG_OFF );
    
    unsigned char command;
    
    
    void init()
    {
    	unsigned char temp;
    
    	// ======================= Cau hinh cac chan vao ra cho PIC ==========================
    	ANSEL = 0x00;
    	TRISA = 0x00;
    	ADCON1 = 0x07;
    	PORTA = 0x00;
    	TRISE = 0x00;
    	PORTE = 0x00;
    	TRISD = 0x07;
    	PORTD = 0x08;	// Put RD3 (CS) in high level
    
    	TRISB = 0x00;	// test	
    	PORTB = 0x00; 	// test
    	// ====================================================================================
    
    	// ============================ Cau hinh module SPI ===================================
    	// Enabling SPI I/O
    	TRISC = 0x10; 		// SDO, SCK -> output
    	SSPEN = 0;			// Turn off SPI
    	
    	SMP = 0;			// Sample bit
    
    	// CPI Mode 0,0
    	CKP = 0;			// Clock polarity select bit: low
    	CKE = 1;			// SPI Clock Edge Select bit
    	WCOL = 0;			// Write collision detect bit
    	SSPOV = 0;			// Receive overflow indicator bit
    
    	SSPM3 = 0;			// Synchronous Serial Port Mode select bit
    	SSPM2 = 0;			// SPI master mode, Fosc/64 ~ 20MHz/64
    	SSPM1 = 1;			//
    	SSPM0 = 0;			//	
    
    	SSPEN = 1;			// Turn on SPI
    	//temp = SSPBUF;		// to clear BF bit!
    	// ====================================================================================/
    
    	
    	// ============================ Khoi tao LCD ==========================================
    	lcd_init();
    	// ====================================================================================
    
    	mcp_reset();		// reset MCP2515
    	mcp_write(MCP_CANCTRL, MODE_CONFIG);	// Cau hinh che do hoat dong : CONFIG 
    	mcp_write(MCP_RXM0SIDH, 0x00);			// Cau hinh mat na cho RXB0
    	mcp_write(MCP_RXM0SIDL, 0x00);			// Cau hinh mat na cho RXB0
    	mcp_write(MCP_TXRTSCTRL, 0x00);		// Cau hinh cac chan RTS cua MCP2515
    	mcp_write(MCP_CANCTRL, MODE_LOOPBACK);	// Cau hinh che do hoat dong : LOOPBACK
    }
    
    void MCP_Send(unsigned char c)
    {
    	MCP_CS = 1;
    	mcp_write(MCP_TXB0CTRL, 0x02);	// Cau hinh do uu tien cua goi tin TXP0 & TXP1
    	mcp_write(MCP_TXB0SIDH, 0x00);	// Cau hinh ID cua goi tin 
    	mcp_write(MCP_TXB0SIDL, 0x00);	// Cau hinh ID cua goi tin
    	mcp_write(MCP_TXB0DLC, 0x08);	// cau hinh so luong byte cua goi tin
    	mcp_write(MCP_TXB0D0, c);		// Byte du lieu 0
    	mcp_write(MCP_TXB0D1, 0x02);
    	mcp_write(MCP_TXB0D2, 0x03);
    	mcp_write(MCP_TXB0D3, 0x04);
    	mcp_write(MCP_TXB0D4, 0x05);
    	mcp_write(MCP_TXB0D5, 0x06);
    	mcp_write(MCP_TXB0D6, 0x07);
    	mcp_write(MCP_TXB0D7, 0x08);
    	mcp_rts(0x01);				// Bat bit TXB0CTRL.TXREQ
    }
    
    void main()
    {
    	init();
    	lcd_gotoxy(1,0);
    	lcd_puts("CAN Demo Board ");
    	lcd_gotoxy(1,1);
    	lcd_puts("Firmware v1.01");
    	__delay_ms(500);
    
    	while(1)
    	{
    		command = 0;
    		if (!RD0) command = command + 0x11;
    		if (!RD1) command = command + 0x22;
    		if (!RD2) command = command + 0x44;
    		MCP_Send(command);
    		lcd_gotoxy(0,0);
    		lcd_puts(" Tx: ");
    		lcd_put_binary(command);
    		command = 0;
    
    		lcd_gotoxy(0,1);
    		lcd_puts(" Rx: ");
    		command = mcp_read(MCP_TXB0D0);
    		lcd_put_binary(command);
    
    		__delay_ms(10);
    	}	
    }
    Một số hàm trong thư viện MCP2515.c em viết như sau:

    Code:

    Code:
    void mcp_reset()
    {
    	unsigned char temp;
    	
    	MCP_CS = 0;
    	SSPBUF = 0xC0;
    	while(!BF);
    	temp = SSPBUF;
    	SSPIF = 0;
    	
    	SSPBUF = 0x00;
    	while(!BF);
    	temp = SSPBUF;
    	SSPIF = 0;
    	
    	MCP_CS = 1;	
    }
    
    void mcp_write(unsigned char addr, unsigned char data)
    {
    	unsigned char temp;
    	temp = SSPBUF;	// doc du lieu trong SSPBUF ra de xoa bit BF
    	MCP_CS = 0;
    
    	
    	SSPBUF = 0x02;	// Write command
    	while(!BF);
    	temp = SSPBUF;
    	SSPIF = 0;
    	
    	SSPBUF = addr;	// write addr
    	while(!BF);
    	temp = SSPBUF;
    	SSPIF = 0;
    	
    	SSPBUF = data;	// write data		
    	while(!BF);
    	temp = SSPBUF;
    	SSPIF = 0;	
    	
    	SSPBUF = 0x00;	// push data out of SSPSR
    	while(!BF);
    	temp = SSPBUF;
    	SSPIF = 0;
    
    	MCP_CS = 1;
    }
    
    void mcp_rts(unsigned char txn)
    {
    	unsigned char temp;
    	temp =SSPBUF;
    	SSPIF = 0;
    
    	temp = 0x80 + txn;
    	
    	if (temp >= 0x81 && temp <= 0x87){	// kiem tra lenh co hop le hay khong
    		MCP_CS = 0;
    		SSPBUF = temp;
    		while(!BF);
    		temp = SSPBUF;
    		SSPIF = 0;
    		MCP_CS = 1;
    	}
    }
    
    unsigned char mcp_read(unsigned char addr)
    {
    	unsigned char temp;
    
    	MCP_CS = 0;
    	
    	SSPBUF = 0x03;	// read command
    	while(!BF);
    	temp = SSPBUF;
    	SSPIF = 0;
    	
    	SSPBUF = 0x00;	
    	while(!BF);
    	temp = SSPBUF;
    	SSPIF = 0;
    
    	MCP_CS = 1;
    	
    	return(temp);
    }
    Vấn đề của em là khi em thực hiện mô phỏng trên Proteus thì ngõ ra SCK và SDO đều có tín hiệu nhưng khi nạp vào mạch thật thì không đọc được giá trị các thanh ghi như mong muốn, nó chỉ hiển thị giá trị đọc về là 0b00000000.
    Như vậy lỗi của em là lỗi ở phần giao tiếp SPI hay lỗi cấu hình MCP2515 không đúng ? Nhờ các bác đã làm qua cái này chỉ giúp em.
    Attached Files

  • #2
    Hình như chân SPI bị nối sai, đúng ra phải là SDO -> SI và SDI -> SO.
    P.S: post 2 ngày rồi mà ko thấy ai trả lời, nản thiệt!

    Comment


    • #3
      hj, Ngày nghỉ hnhư diễn đàn cũng nghì luôn thì pải bạn ag!

      Comment


      • #4
        Hình như có ít người quan tâm đến mảng CAN này, hy vọng sẽ có người giúp đỡ mình

        Comment


        • #5
          Ban vaa_dtvn ơi. bạn có thể tìm được con mcp2551 trong proteus không vậy. tôi đang định mô phỏng mà tìm không ra. ah tại sao mình lại dùng con 2515 vậy bạn.
          Mong bạn sớm hồi âm.
          Thanks so much.

          Comment

          Về tác giả

          Collapse

          vaa_dtvn Tìm hiểu thêm về vaa_dtvn

          Bài viết mới nhất

          Collapse

          Đang tải...
          X