//******************************************************************************
//
// File Name : 'spi.c'
// Author : Skytrack ltd - Copyright (C) 2008
// Created : 12/07/2008
// Version : 1.0
//
// This code is property of Skytrack company
//
//******************************************************************************
#include <iom48.h>
#include "spi.h"
void SPI_MasterInit(void)
{
DDR_SPI |= (1 << DD_MOSI)|(1 << DD_SCK)|(1 << DD_SS);
DDR_SPI &= ~(1 << DD_MISO);
SPCR = (1 << SPE)|(1 << MSTR);
//SPSR |= (1 << SPI2X);
}
char SPI_MasterTransmit(char cData)
{
SPDR = cData;
while(!(SPSR & (1<<SPIF)));
return SPDR;
}
//end
//******************************************************************************
//
// File Name : 'spi.h'
// Author : Skytrack ltd - Copyright (C) 2008
// Created : 12/07/2008
// Version : 1.0
//
// This code is property of Skytrack company
//
//******************************************************************************
#ifndef SPI_H
#define SPI_H
#define DDR_SPI DDRB
#define DD_SS PB2
#define DD_MOSI PB3
#define DD_MISO PB4
#define DD_SCK PB5
void SPI_MasterInit(void);
char SPI_MasterTransmit(char cData);
#endif
//end
//******************************************************************************
//
// File Name : 'mcp2515.c'
// Author : Skytrack ltd - Copyright (C) 2008
// Created : 12/07/2008
// Version : 1.0
//
// This code is property of Skytrack company
//
//******************************************************************************
#include <iom48.h>
#include <intrinsics.h>
#include "mcp2515.h"
#include "spi.h"
#define CS_LOW PORTB &= ~(1 << PB2);
#define CS_HIGH PORTB |= (1 << PB2);
void MCP2515_Init()
{
DDRD |= (1 << PD7);
PORTD |= (1 << PD7);
DDRB |= (1 << PB2);
CS_HIGH;
}
void MCP2515_SoftReset()
{
CS_LOW;
SPI_MasterTransmit(MCP2515_RESET);
CS_HIGH;
}
void MCP2515_HardReset()
{
PORTD |= (1 << PD7);
__delay_cycles(1600000);
PORTD &= ~(1 << PD7);
__delay_cycles(1600000);
PORTD |= (1 << PD7);
__delay_cycles(1600000);
}
unsigned char MCP2515_Read(unsigned char address)
{
unsigned char nResult;
CS_LOW;
SPI_MasterTransmit(MCP2515_READ);
SPI_MasterTransmit(address);
nResult = SPI_MasterTransmit(0);
CS_HIGH;
return nResult;
}
void MCP2515_Write(unsigned char address, unsigned char data)
{
CS_LOW;
SPI_MasterTransmit(MCP2515_WRITE);
SPI_MasterTransmit(address);
SPI_MasterTransmit(data);
CS_HIGH;
}
unsigned char MCP2515_ReadStatus()
{
unsigned char nResult;
CS_LOW;
SPI_MasterTransmit(MCP2515_STATUS);
nResult = SPI_MasterTransmit(0);
CS_HIGH;
return nResult;
}
void MCP2515_BitMod(unsigned char address, unsigned char mask, unsigned char data)
{
CS_LOW;
SPI_MasterTransmit(MCP2515_BITMOD);
SPI_MasterTransmit(address);
SPI_MasterTransmit(mask);
SPI_MasterTransmit(data);
CS_HIGH;
}
void MCP2515_Rts(unsigned char TXBn)
{
unsigned char RTS_Value = MCP2515_RTS | TXBn;
CS_LOW;
SPI_MasterTransmit(RTS_Value);
CS_HIGH;
}
void MCP2515_Set_Config_Mode()
{
do {
MCP2515_BitMod(0x0F, 0xE0, 0x80);
} while ((MCP2515_Read(0x0E) & 0xE0) != 0x80);
}
void MCP2515_Set_Listen_Mode()
{
MCP2515_BitMod(0x0F, 0xE0, 0x60);
}
void MCP2515_Set_Normal_Mode()
{
do {
MCP2515_BitMod(0x0F, 0xE0, 0x80);
MCP2515_BitMod(0x0F, 0xE0, 0x00);
} while(MCP2515_Read(0x0E) & 0xE0);
}
void MCP2515_Set_Sleep_Mode()
{
do {
MCP2515_BitMod(0x0F, 0xE0, 0x80);
MCP2515_BitMod(0x0F, 0xE0, 0x00);
} while(MCP2515_Read(0x0E) & 0xE0);
}
// end
Ну и открывок кода
__watchdog_reset();
MCP2515_HardReset();
__watchdog_reset();
MCP2515_Set_Config_Mode();
TRACE("MCP2515 IS IN CONFIG MODE\r\n");
// Disable ClkOut
MCP2515_BitMod(CANCTRL, 0x07, 0x00);
// Configure input buffers
MCP2515_Write(RXB0CTRL, 0x00);
MCP2515_Write(RXB1CTRL, 0x00);
// Receive buffer 1 will no be used during this lab
MCP2515_Write(RXM1SIDH, 0xFF);
MCP2515_Write(RXM1SIDL, 0xE0);
MCP2515_Write(RXF2SIDH, 0x00);
MCP2515_Write(RXF2SIDL, 0x00);
MCP2515_Write(RXF3SIDH, 0x00);
MCP2515_Write(RXF3SIDL, 0x00);
MCP2515_Write(RXF4SIDH, 0x00);
MCP2515_Write(RXF4SIDL, 0x00);
MCP2515_Write(RXF5SIDH, 0x00);
MCP2515_Write(RXF5SIDL, 0x00);
if (nVehicle == VEHICLE_MERCEDES)
{
// Set speed
MCP2515_Write(CNF1, 0x4B);
MCP2515_Write(CNF2, 0x8A);
MCP2515_Write(CNF3, 0x01);
MCP2515_Write(RXM0SIDH, 0xFF);
MCP2515_Write(RXM0SIDL, 0xE0);
MCP2515_Write(RXF0SIDH, 0x39);
MCP2515_Write(RXF0SIDL, 0x40);
MCP2515_Write(RXF1SIDH, 0xFF);
MCP2515_Write(RXF1SIDL, 0xE0);
}
// Disable all MCP2515 interrupts
MCP2515_Write(CANINTE, 0x00);
__watchdog_reset();
// Put MCP2515 into Normal Mode
TRACE("MCP2515 TRY NORMAL MODE\r\n");
MCP2515_Set_Normal_Mode();
TRACE("MCP2515 IS IN NORMAL MODE\r\n");
чтение - в цикле
if (MCP2515_ReadStatus() & 0x01) {
unsigned char sidh = MCP2515_Read(RXB0SIDH);
unsigned char sidl = MCP2515_Read(RXB0SIDL);
unsigned char d0 = MCP2515_Read(RXB0D0);
unsigned char d1 = MCP2515_Read(RXB0D1);