Мультимастерный режим I2C на плате AVR32

Привет я работаю в студии Atmel v6.1 для контроллера AVR32 (AT32UC3A0512). Я работаю на I2C для связи с устройством камеры (NanoCam C1U). Обратите внимание, что, поскольку камера автоматически отправляет сообщение I2C, когда данные готовы для подсистемы, находящейся на шине I2C, шина должна работать в мультимастерном режиме I2C. Таким образом, ведомый режим I2C не поддерживается.

Ниже приведен код многоадресной связи I2C. Я могу отправлять данные на камеру, но не могу получать с нее. Пожалуйста, помогите мне найти ошибку в приведенном ниже коде.

AVR32_TWI.CR.svdis = 1;     //slave disable
AVR32_TWI.CR.msen = 1;      //master enable
AVR32_TWI.MMR.dadr = 0x5;   //OBC AVR32 address

void cam_snap(void)
{
    const uint8_t CAMSnapCmd[2] = {0x84,0x65};
    uint8_t CamSnapCmdOutput[70];

    AVR32_TWI.CR.svdis=1;   //slave disable
    AVR32_TWI.CR.msen=1;        //master enable
    AVR32_TWI.MMR.dadr=0x6; //Camera slave device address.
    AVR32_TWI.MMR.mread = 0;    // write mode

    lPayloadTimeout = PAYLOAD_TIMEOUT ;
    AVR32_TWI.THR.txdata = CAMSnapCmd[0];
    while(AVR32_TWI.SR.txrdy!=1)
    {
        if(lPayloadTimeout == 0)
            return;
        else
            lPayloadTimeout--;
    }

    lPayloadTimeout = PAYLOAD_TIMEOUT ;
    AVR32_TWI.THR.txdata=CAMSnapCmd[1];
    while(AVR32_TWI.SR.txrdy!=1)
    {
        if(lPayloadTimeout == 0)
            return;
        else
            lPayloadTimeout--;
    }

    lPayloadTimeout = PAYLOAD_TIMEOUT ;
    while(AVR32_TWI.SR.txcomp!=1)
    {
        if(lPayloadTimeout == 0)
            return;
        else
            lPayloadTimeout--;
    }

    AVR32_TWI.SMR.sadr=0x5; //OBC Master address AVR32
    AVR32_TWI.CR.msdis=1;//master disable
    AVR32_TWI.CR.sven=1;//slave enable
    //AVR32_TWI.MMR.mread = 0;

    for(int j =0; j< 65; j++) 
    {
        lPayloadTimeout = PAYLOAD_TIMEOUT ;
        while(AVR32_TWI.SR.rxrdy!=1)
        {
            if(lPayloadTimeout == 0)
                return;
            else
                lPayloadTimeout--;
        }
        CamSnapCmdOutput[j] = AVR32_TWI.RHR.rxdata;
        uint8_t test_result = CamSnapCmdOutput[0];
    }
}

0 ответов

Другие вопросы по тегам