2020年6月7日日曜日

eXoCANライブラリで送信バッファ改善してみた。

前回使用してみた、STM32Duino用のeXoCANライブラリ、can.transmitで一気にたくさんデータを送信すると歯抜けしてしまう事がわかった。delayを1msぐらいいれると問題なく送れるので、他でも言われているように送信のmailboxを一個しか使っていないからかもしれない?
ということでいろいろな記事を参考にmaple純正のHardwareCANライブラリのように変更してみた。
bool eXoCAN::transmit(int txId, const void *ptr, unsigned int len)
{
    int mailbox = -1; 
    if (periphBit(tsr, 26)) {
        mailbox = 0;
    } else if (periphBit(tsr, 27)) {
        mailbox = 1;
    } else if (periphBit(tsr, 28)) {
        mailbox = 2;
    } else {
        return false;
    }

    volatile uint32_t *TIxR, *TDTxR, *TDLxR, *TDHxR;

    switch(mailbox){
        case 0:
            TIxR  = &MMIO32(ti0r);
            TDTxR = &MMIO32(tdt0r);
            TDLxR = &MMIO32(tdl0r);
            TDHxR = &MMIO32(tdh0r);
            break;
        case 1:
            TIxR  = &MMIO32(ti1r);
            TDTxR = &MMIO32(tdt1r);
            TDLxR = &MMIO32(tdl1r);
            TDHxR = &MMIO32(tdh1r);
            break;
        case 2:
            TIxR  = &MMIO32(ti2r);
            TDTxR = &MMIO32(tdt2r);
            TDLxR = &MMIO32(tdl2r);
            TDHxR = &MMIO32(tdh2r);
            break;
    }

    if (_extIDs)
        *TIxR = (txId << 3) | 0b100;   // 29bit ID
    else
        *TIxR = (txId << 21) | 0b000;  // 11bit ID

    *TDTxR = (len & 0xF);
    *TDLxR = ((const uint32_t *)ptr)[0];
    *TDHxR = ((const uint32_t *)ptr)[1];
    *TIxR |= 1;

    return true;
}
まずはeXoCAN.cppの送信部分をこんな感じで変更してみた。
そんでもってeXoCAN.hのところ追加のmailboxのレジスタを追記。
constexpr static uint32_t ti1r  = CANBase + 0x190;
constexpr static uint32_t tdt1r = CANBase + 0x194;
constexpr static uint32_t tdl1r = CANBase + 0x198;
constexpr static uint32_t tdh1r = CANBase + 0x19C;

constexpr static uint32_t ti2r  = CANBase + 0x1A0;
constexpr static uint32_t tdt2r = CANBase + 0x1A4;
constexpr static uint32_t tdl2r = CANBase + 0x1A8;
constexpr static uint32_t tdh2r = CANBase + 0x1AC;
これでビルドしてみたらうまく動いてそう。ただし3個より多くのデータを一気に送ると順不同になってしまう(CAN受信側の問題かもしれない?ほぼ同時。)けど特に問題なさそう。
更にはfalseが帰ってきたら再送できるようにwhileで回す感じにして送信してみた。
とりあえずはそこら辺を変更して送信抜けがないように変更してみている。

0 件のコメント:

コメントを投稿