This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts
This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

MCP2515 Library for NRF52

Hi everyone,

Im working and learning for private project CAN bus sniffer which when receive some data trigger some relay...

I have mcp2515_can hw-184 board on which Im replace TJA1050 chip for SN65HVD230. Im add J1 jumper to connect 120ohm resistor. Then Im connect on other side Lawicel CANUSB device together with CANHack software and open 500k CAN connection and periodicly send some data...

Im try few MCP2515 library written in C but looks like none of them do not work or maybe Im do something wrong... I don't have any special tool to analyze frequency on SPI interface...

I use in software:

SPI_SCK_PIN = P0.26

SPI_MISO_PIN  = P0.30

SPI_MOSI_PIN = P0.29

SPI_SS_PIN = P0.31

Connections:

MCP2515 <-> NRF52840 PDK

INT - No connection

SCK <-> P0.26

SI <-> P0.29

SO <-> P0.30

CS <-> P0.31

GND <-> GND

VCC <-> VDD

MCP2515:

NRF52840:

Any hint what to check that I will be sure that SPI interface and connections are ok and I have only software problems? Or is here some working MCP2515 library compatible with NRF5 SDK 17.0.2 ? Or maybe can I somehow change SPI example to test that MCP2515 realy work? I will and I use Softdevice S140(BLE peripheral) if this is important...

Thanks for any help.

Parents
  • Some additional info.

    Currently I use library provided by user with commented  mcp2515_readRegisterS and log function in main loop.

    Library Im get from that thread:

    https://devzone.nordicsemi.com/f/nordic-q-a/52046/nrf52832-spi-with-mcp2515-nrf_drv_spi_transfer-seems-to-send-properly-but-not-receiving-in-all-cases

    I get log:

    <info> app: Start

    <info> app: Transfer completed.
    <info> app: Transfer completed.
    <info> app: Transfer completed.
    <info> app: Transfer completed.
    <info> app: Transfer completed.
    <info> app: Enter setting mode success

    <info> app: Transfer completed.
    <info> app: Transfer completed.
    <info> app: Transfer completed.
    <info> app: set rate success!!

    <info> app: Transfer completed.
    <info> app: Transfer completed.
    <info> app: Transfer completed.
    <info> app: Transfer completed.
    <info> app: Transfer completed.
    <info> app: Transfer completed.
    <info> app: Transfer completed.
    <info> app: Transfer completed.
    <info> app: Transfer completed.
    <info> app: Transfer completed.
    <info> app: Transfer completed.
    <info> app: Transfer completed.
    <info> app: Transfer completed.
    <info> app: Transfer completed.
    <info> app: Transfer completed.
    <info> app: Transfer completed.
    <info> app: Transfer completed.
    <info> app: Transfer completed.
    <info> app: Transfer completed.
    <info> app: Transfer completed.
    <info> app: Transfer completed.
    <info> app: Transfer completed.
    <info> app: Transfer completed.
    <info> app: Transfer completed.
    <info> app: Transfer completed.
    <info> app: Transfer completed.
    <info> app: Transfer completed.
    <info> app: Transfer completed.
    <info> app: Transfer completed.
    <info> app: Transfer completed.
    <info> app: Transfer completed.
    <info> app: Transfer completed.
    <info> app: Transfer completed.
    <info> app: Transfer completed.
    <info> app: Transfer completed.
    <info> app: Transfer completed.
    <info> app: Transfer completed.
    <info> app: Transfer completed.
    <info> app: Transfer completed.
    <info> app: Transfer completed.
    <info> app: Transfer completed.
    <info> app: Transfer completed.
    <info> app: Transfer completed.
    <info> app: Transfer completed.
    <info> app: Transfer completed.
    <info> app: Transfer completed.
    <info> app: Transfer completed.
    <info> app: Transfer completed.
    <info> app: Transfer completed.
    <info> app: Transfer completed.
    <info> app: Transfer completed.
    <info> app: Enter Normal Mode Success!!

    <info> app: CAN initialization ok
    <info> app: Transfer completed.
    <info> app: Transfer completed.
    <info> app: Transfer completed.
    <info> app: Transfer completed.
    <info> app: Transfer completed.
    <info> app: Transfer completed.
    <info> app: Transfer completed.
    <info> app: Transfer completed.
    <info> app: Transfer completed.
    <info> app: Transfer completed.
    <info> app: Transfer completed.
    <info> app: Transfer completed.
    <info> app: Transfer completed.

    So it looks like SPI work. If I call setMode() function and then read mode with getMode() like this:

    setMode(MODE_LISTENONLY);

    NRF_LOG_INFO("Mode: 0x%02X", getMode());

    I get changed mode value. So I think this is ok. Function checkReceive() allways return status 4 if that compare to CAN status then this mean CAN_NOMSG so there is no CAN bus messages(I sending messages from CANUSB device)...

    If I uncoment original calls in main loop I get in log values:

    <info> app: Transfer completed.
    <info> app: Data Received 0 0x0
    <info> app: Data Received 1 0x0
    <info> app: Data Received 2 0x0
    <info> app: Data Received 3 0x0
    <info> app: Data Received 4 0x8

    <info> app: Transfer completed.

    Then I connect to my CANUSB device and open connection and send some data to CAN bus and receive:

    <info> app: Transfer completed.
    <info> app: Data Received 0 0x0
    <info> app: Data Received 1 0x3
    <info> app: Data Received 2 0x3
    <info> app: Data Received 3 0x0
    <info> app: Data Received 4 0x8
    <info> app: Transfer completed.

    So probably CAN and SPI connection work corectly but need complete "driver" to read/write data on canbus...

    After additional researching Im also found that VDD voltage is 2,98V and SN65HVD230 need to work 3,00-3,6V. SN65HVD230 get on pin 2,97V. Then Im select switch to power nrf from USD(Before has been VDD) connect power supply to USB port(nRF USB) to provide power for board. And by registers set voltage to 3.3V(UICR_REGOUT0_VOUT_3V3) ... Reboot board and again check VDD voltage and now is 3.3V and on SN65HVD230 I get 3,29V. But there is no difference...

    CANUSB as I know use SJA1000 CAN Bus controller with Philips 82C251 CAN Tranceiver.

    Thanks for any help.

  • Im little closer to solution...

    Im add in main loop:

    for (;;)
        {
            NRF_LOG_INFO("MCP_TXB0CTRL : %d", mcp2515_readRegister(MCP_TXB0CTRL));
            nrf_delay_ms(10);
            NRF_LOG_INFO("MCP_TXB1CTRL : %d", mcp2515_readRegister(MCP_TXB1CTRL));
            nrf_delay_ms(10);
            NRF_LOG_INFO("MCP_TXB2CTRL : %d", mcp2515_readRegister(MCP_TXB2CTRL));
            nrf_delay_ms(10);

            NRF_LOG_INFO("MCP_RXB0CTRL : %d", mcp2515_readRegister(MCP_RXB0CTRL));
            nrf_delay_ms(10);
            NRF_LOG_INFO("MCPRXB1CTRL : %d", mcp2515_readRegister(MCP_RXB1CTRL));
            nrf_delay_ms(500);

            static uint8_t data[8] = {0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};
            
            mcp2515_write_canMsg(MCP_TXB0SIDH, 0x123, 0, 0, sizeof(data)/sizeof(uint8_t), &data);
            nrf_delay_ms(500);

            idle_state_handle();
        }

    And I get in log:

    <info> app: Transfer completed.
    <info> app: MCP_TXB0CTRL : 0
    <info> app: Transfer completed.
    <info> app: MCP_TXB1CTRL : 0
    <info> app: Transfer completed.
    <info> app: MCP_TXB2CTRL : 0
    <info> app: Transfer completed.
    <info> app: MCP_RXB0CTRL : 6
    <info> app: Transfer completed.
    <info> app: MCPRXB1CTRL : 0
    <info> app: Transfer completed.
    <info> app: Transfer completed.

    And I also receive CAN messages to computer, so CAN work normaly:

    But actual data are not transmitted, so I need to check what Im do wrong that data array is not transmited...

    Also if I loop sending CAN message like:

    mcp2515_write_canMsg(MCP_TXB0SIDH, 0x300, 0, 0, 1, ((uint8_t *)(0x29)));

    Application send 512 messages but when I try send 513 message it crash with error:

    <error> app: ERROR 3735928559 [Unknown error code] at D:\SDK\modules\nrfx\drivers\src\nrfx_spim.c:558
    PC at: 0x00032517

    There is no difference if I "round robin" over TX buffers it crash when total 512 messages are send and try send message 513 ...

    Also there is no difference if I send bigger data(Data is on computer not received) like:

    mcp2515_write_canMsg(MCP_TXB0SIDH, 0x300, 0, 0, 2, ((uint8_t *)(0x29, 0x30)));

    It still crash after 512 messages...

Reply
  • Im little closer to solution...

    Im add in main loop:

    for (;;)
        {
            NRF_LOG_INFO("MCP_TXB0CTRL : %d", mcp2515_readRegister(MCP_TXB0CTRL));
            nrf_delay_ms(10);
            NRF_LOG_INFO("MCP_TXB1CTRL : %d", mcp2515_readRegister(MCP_TXB1CTRL));
            nrf_delay_ms(10);
            NRF_LOG_INFO("MCP_TXB2CTRL : %d", mcp2515_readRegister(MCP_TXB2CTRL));
            nrf_delay_ms(10);

            NRF_LOG_INFO("MCP_RXB0CTRL : %d", mcp2515_readRegister(MCP_RXB0CTRL));
            nrf_delay_ms(10);
            NRF_LOG_INFO("MCPRXB1CTRL : %d", mcp2515_readRegister(MCP_RXB1CTRL));
            nrf_delay_ms(500);

            static uint8_t data[8] = {0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};
            
            mcp2515_write_canMsg(MCP_TXB0SIDH, 0x123, 0, 0, sizeof(data)/sizeof(uint8_t), &data);
            nrf_delay_ms(500);

            idle_state_handle();
        }

    And I get in log:

    <info> app: Transfer completed.
    <info> app: MCP_TXB0CTRL : 0
    <info> app: Transfer completed.
    <info> app: MCP_TXB1CTRL : 0
    <info> app: Transfer completed.
    <info> app: MCP_TXB2CTRL : 0
    <info> app: Transfer completed.
    <info> app: MCP_RXB0CTRL : 6
    <info> app: Transfer completed.
    <info> app: MCPRXB1CTRL : 0
    <info> app: Transfer completed.
    <info> app: Transfer completed.

    And I also receive CAN messages to computer, so CAN work normaly:

    But actual data are not transmitted, so I need to check what Im do wrong that data array is not transmited...

    Also if I loop sending CAN message like:

    mcp2515_write_canMsg(MCP_TXB0SIDH, 0x300, 0, 0, 1, ((uint8_t *)(0x29)));

    Application send 512 messages but when I try send 513 message it crash with error:

    <error> app: ERROR 3735928559 [Unknown error code] at D:\SDK\modules\nrfx\drivers\src\nrfx_spim.c:558
    PC at: 0x00032517

    There is no difference if I "round robin" over TX buffers it crash when total 512 messages are send and try send message 513 ...

    Also there is no difference if I send bigger data(Data is on computer not received) like:

    mcp2515_write_canMsg(MCP_TXB0SIDH, 0x300, 0, 0, 2, ((uint8_t *)(0x29, 0x30)));

    It still crash after 512 messages...

Children
No Data
Related