반응형
예제 소스코드 출처
ATmega128 과 MCP2515 의 예제 프로젝트가 있다.
다음의 링크에서 소스를 받아서 테스트하도록한다.
실제 수정된 코드 : ATmega 128 에서 MCP2515 돌리기
위의 받은 소스코드에서.. 수정한사항은 다음과 같다.
bool mcp2515_init(void)
{
unsigned int test_value;
SET_OUTPUT(MCP2515_CS);
SPI0_Init();
// reset MCP2515 by software reset.
// After this he is in configuration mode.
RESET(MCP2515_CS);
spi_putc(SPI_RESET);
SET(MCP2515_CS);
// wait a little bit until the MCP2515 has restarted
_delay_us(100);
// load CNF1..3 Register
RESET(MCP2515_CS);
spi_putc(SPI_WRITE);
spi_putc(CNF3);
spi_putc((1<<PHSEG21)); // Bitrate 125 kbps at 16 MHz
spi_putc((1<<BTLMODE)|(1<<PHSEG11));
spi_putc((1<<BRP2)|(1<<BRP1)|(1<<BRP0));
// activate interrupts
spi_putc((1<<RX1IE)|(1<<RX0IE));
SET(MCP2515_CS);
test_value = mcp2515_read_register(CNF1);
printf("test value is [%d]rn",test_value);
// test if we could read back the value => is the chip accessible?
if (mcp2515_read_register(CNF1) != ((1<<BRP2)|(1<<BRP1)|(1<<BRP0))) {
return false;
}
// deaktivate the RXnBF Pins (High Impedance State)
mcp2515_write_register(BFPCTRL, 0);
// set TXnRTS as inputs
mcp2515_write_register(TXRTSCTRL, 0);
// turn off filters => receive any message
mcp2515_write_register(RXB0CTRL, (1<<RXM1)|(1<<RXM0));
mcp2515_write_register(RXB1CTRL, (1<<RXM1)|(1<<RXM0));
// reset device to normal mode
mcp2515_write_register(CANCTRL, 0);
return true;
}
주의 해야할점은 RESET 후에 기다리는 시간이다.
기본은 10us 를 기다리게 되어있는데 10us 를 기다리면 데이터 통신이 아예 되지 않는다.
그리고 나머지... SPI 초기화 부분과 UART 초기화 부분을 수정했다. (myAVR128 보드에 맞게..)
반응형