|
Tài trợ cho PIC Vietnam |
Giao tiếp USB, CAN, I2C, SPI, USART... Những giao tiếp được tích hợp trên PIC |
|
Ðiều Chỉnh | Xếp Bài |
05-05-2012, 09:50 AM | #1 |
Nhập môn đệ tử
Tham gia ngày: Jul 2009
Bài gửi: 10
: |
Đồ á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:
#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); } } 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); } 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. |
|
|