HW 기초

ATmega 128 에서 MCP2515 돌리기

. . . 2014. 2. 12. 10:19
반응형

예제 소스코드 출처

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 보드에 맞게..)

반응형