WRTNode2P通过spi操作MCP2515读取can bus数据问题

WRTNode2P通过spi连接MCP2515模块,发送操作指令,在can bus上发送和读取数据。
设备对端是个单片机,同样通过spi连接MCP2515模块进行can bus通讯。
 
单片机通过MCP2515模块的中断去读取数据,读取WRTNode发送的数据很顺利,解析正常,然后回复数据。
因为WRTNode不便实现中断,所以我采用了在线程里轮询方式,去发送spi指令读取数据.但WRTNode接收数据不完整。中间会随机掉部分字节。甚至改用死循环方式全力轮询读取都不行。
 
非要自己撰写驱动实现中断读取?还是换块WRTNode带单片机的开发板?还是我程序代码那里没弄对?
求解决方案 Orz

 
附上一些其他信息:
MCP2515模块的spi一共有5根引脚,除了cs,so,si,sck,还有根int数据中断通知。
单片机有接spi的int中断引脚。
WRTNode2P没有接spi的int中断引脚。
WRTNode使用挂载的spidev驱动,在用户空间,应用程序打开/dev/spidev32766.1设备,使用read和write读取和写入fd,无法正常工作,换用ioctl调用SPI_IOC_MESSAGE类型操作即可正常工作。
函数代码如下:
unsigned char MCP2515_ReadAddr(unsigned char addr)
{
    unsigned char rByte = 0;

    unsigned char cmd = CAN_READ;
    struct spi_ioc_transfer xfer[3];
    int ret;

    memset(xfer, 0, sizeof(xfer));
    xfer[0].tx_buf = &cmd;
    xfer[0].len = 1;
    xfer[0].speed_hz = speed;
    xfer[0].bits_per_word = bits;
    xfer[1].tx_buf = &addr;
    xfer[1].len = 1;
    xfer[1].speed_hz = speed;
    xfer[1].bits_per_word = bits;
    xfer[2].rx_buf = &rByte;
    xfer[2].len = 1;
    xfer[2].speed_hz = speed;
    xfer[2].bits_per_word = bits;

    ret = ioctl(fd, SPI_IOC_MESSAGE(3), xfer);
    if (ret < 0) {
        printf("SPI_IOC_MESSAGE\n");
        return;
    }
}

在线程中轮询调用读取函数,可以读出单片机发回来的大部分数据。只是中间会随机掉不少字节。
函数代码如下:
unsigned char CAN_Receive_Buffer(unsigned char *CAN_RX_Buf)
{
    unsigned char i=0,len=0,temp=0;

    temp = MCP2515_ReadAddr(CANINTF);
    if(temp & 0x01)
    {
        len=MCP2515_ReadAddr(RXB0DLC);//读取接收缓冲器0接收到的数据长度(0~8个字节)
        while(i<len)
        {    
            CAN_RX_Buf=MCP2515_ReadAddr(RXB0D0+i);//把CAN接收到的数据放入指定缓冲区
            i++;
        }
        MCP2515_WriteAddr(CANINTF, 0);//清除中断标志位(中断标志寄存器必须由MCU清零)
    }

    return len;
}
已邀请:

xzmu - 10w

赞同来自:

注意看spi的时钟频率,还有读取的长度要配合好

要回复问题请先登录注册