![]() |
|
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 |
|
|
#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. |
|
|
|
|
|