亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? ac97c.c

?? IAR5.2下 AT91SAM9260 ARM 對 MCP2515 控制源化碼
?? C
?? 第 1 頁 / 共 2 頁
字號:

//------------------------------------------------------------------------------
/// Starts a read or write transfer on the given channel
/// \param channel particular channel (AC97C_CHANNEL_A or AC97C_CHANNEL_B).
/// \param pBuffer buffer containing the slots to send.
/// \param numSamples total number of samples to send.  
/// \param callback optional callback function.
/// \param pArg optional argument to the callback function.
//------------------------------------------------------------------------------
unsigned char AC97C_Transfer(
    unsigned char channel,
    unsigned char *pBuffer,
    unsigned int numSamples,
    Ac97Callback callback,
    void *pArg)
{
    unsigned int size;
    unsigned int data;
    Ac97Transfer *pTransfer;

    SANITY_CHECK(channel <= 5);
    SANITY_CHECK(pBuffer);
    SANITY_CHECK(numSamples > 0);

    // Check that no transfer is pending on the channel
    pTransfer = &(ac97c.transfers[channel]);
    if (pTransfer->numSamples > 0) {

        trace_LOG(trace_WARNING, "-W- AC97C_Transfer: Channel %d is busy\n\r", channel);
        return AC97C_ERROR_BUSY;
    }

    // Fill transfer information
    pTransfer->pBuffer = pBuffer;
    pTransfer->numSamples = numSamples;
    pTransfer->callback = callback;
    pTransfer->pArg = pArg;

    // Transmit or receive over codec channel
    if (channel == AC97C_CODEC_TRANSFER) {

        // Send command
        data = *((unsigned int *) pTransfer->pBuffer); 
        AT91C_BASE_AC97C->AC97C_COTHR = data;

        // Check if transfer is read or write
        if ((data & AT91C_AC97C_READ) != 0) {

            AT91C_BASE_AC97C->AC97C_COMR |= AT91C_AC97C_RXRDY;
        }
        else {
        
            pTransfer->pBuffer += sizeof(unsigned int);
            AT91C_BASE_AC97C->AC97C_COMR |= AT91C_AC97C_TXRDY;
        }

        // Enable interrupts
        AT91C_BASE_AC97C->AC97C_IER |= AT91C_AC97C_COEVT;
    }
    // Transmit over channel A
    else if (channel == AC97C_CHANNEL_A_TRANSMIT) {

        // Disable PDC
        AT91C_BASE_AC97C->AC97C_PTCR = AT91C_PDC_TXTDIS;

        // Fill PDC buffers
        size = min(pTransfer->numSamples, MAX_PDC_COUNTER);
        AT91C_BASE_AC97C->AC97C_TPR = (unsigned int) pTransfer->pBuffer;
        AT91C_BASE_AC97C->AC97C_TCR = size;
        pTransfer->pBuffer += size * GetSampleSize(AC97C_CHANNEL_A);

        size = min(pTransfer->numSamples - size, MAX_PDC_COUNTER);
        if (size > 0) {

            AT91C_BASE_AC97C->AC97C_TNPR = (unsigned int) pTransfer->pBuffer;
            AT91C_BASE_AC97C->AC97C_TNCR = size;
            pTransfer->pBuffer += size * GetSampleSize(AC97C_CHANNEL_A);
        }

        // Enable interrupts
        AT91C_BASE_AC97C->AC97C_CAMR |= AT91C_AC97C_PDCEN | AT91C_AC97C_ENDTX;
        AT91C_BASE_AC97C->AC97C_IER |= AT91C_AC97C_CAEVT;

        // Start transfer
        AT91C_BASE_AC97C->AC97C_PTCR = AT91C_PDC_TXTEN;
    }
    // Receive over channel A
    else if (channel == AC97C_CHANNEL_A_RECEIVE) {

        // Disable PDC
        AT91C_BASE_AC97C->AC97C_PTCR = AT91C_PDC_RXTDIS;

        // Fill PDC buffers
        size = min(pTransfer->numSamples, MAX_PDC_COUNTER);
        AT91C_BASE_AC97C->AC97C_RPR = (unsigned int) pTransfer->pBuffer;
        AT91C_BASE_AC97C->AC97C_RCR = size;
        pTransfer->pBuffer += size * GetSampleSize(AC97C_CHANNEL_A);

        size = min(pTransfer->numSamples - size, MAX_PDC_COUNTER);
        if (size > 0) {

            AT91C_BASE_AC97C->AC97C_RNPR = (unsigned int) pTransfer->pBuffer;
            AT91C_BASE_AC97C->AC97C_RNCR = size;
            pTransfer->pBuffer += size * GetSampleSize(AC97C_CHANNEL_A);
        }

        // Enable interrupts
        AT91C_BASE_AC97C->AC97C_CAMR |= AT91C_AC97C_PDCEN | AT91C_AC97C_ENDRX;
        AT91C_BASE_AC97C->AC97C_IER |= AT91C_AC97C_CAEVT;

        // Start transfer
        AT91C_BASE_AC97C->AC97C_PTCR = AT91C_PDC_RXTEN;
    }

    return 0;
}

//------------------------------------------------------------------------------
/// Stop read or write transfer on the given channel.
/// \param channel  Channel number.
//------------------------------------------------------------------------------
void AC97C_CancelTransfer(unsigned char channel)
{    
    unsigned int size = 0;
    Ac97Transfer *pTransfer;

    SANITY_CHECK(channel <= AC97C_CHANNEL_B_TRANSMIT);

    // Save remaining size
    pTransfer = &(ac97c.transfers[channel]);
    size = pTransfer->numSamples;
    pTransfer->numSamples = 0;

    // Stop PDC
    if (channel == AC97C_CHANNEL_A_TRANSMIT) {

        AT91C_BASE_AC97C->AC97C_PTCR = AT91C_PDC_TXTDIS;
        size -= min(size, MAX_PDC_COUNTER) - AT91C_BASE_AC97C->AC97C_TCR;
    }
    if (channel == AC97C_CHANNEL_A_RECEIVE) {

        AT91C_BASE_AC97C->AC97C_PTCR = AT91C_PDC_RXTDIS;
        size -= min(size, MAX_PDC_COUNTER) - AT91C_BASE_AC97C->AC97C_RCR;
    }

    // Invoke callback if provided
    if (pTransfer->callback) {

        pTransfer->callback(pTransfer->pArg, AC97C_ERROR_STOPPED, size);
    }
}

//------------------------------------------------------------------------------
/// Initializes the AC97 controller.
//------------------------------------------------------------------------------
void AC97C_Configure(void)
{
    unsigned char channel;

    // Enable the AC97 controller peripheral clock
    AT91C_BASE_PMC->PMC_PCER = (1 << AT91C_ID_AC97C);   
    
    // Enable the peripheral and variable rate adjustment
    AT91C_BASE_AC97C->AC97C_MR = AT91C_AC97C_ENA  | AT91C_AC97C_VRA;

    // Unassigns all input & output slots
    AC97C_AssignInputSlots(0, 0xFFFF);
    AC97C_AssignOutputSlots(0, 0xFFFF);

    // Install the AC97C interrupt handler
    AT91C_BASE_AC97C->AC97C_IDR = 0xFFFFFFFF;
    AIC_ConfigureIT(AT91C_ID_AC97C, 0, AC97C_Handler);
    AIC_EnableIT(AT91C_ID_AC97C);  

    // Disable PDC transfers
    AT91C_BASE_AC97C->AC97C_PTCR = AT91C_PDC_TXTDIS | AT91C_PDC_RXTDIS;

    // Clear channel transfers
    for (channel = 0; channel < AC97C_CHANNEL_B_TRANSMIT; channel++) {

        ac97c.transfers[channel].numSamples = 0;
    }
}

//------------------------------------------------------------------------------
/// Configures the desired channel with the given value.
/// \param channel  Channel number.
/// \param cfg  Configuration value.
//------------------------------------------------------------------------------
void AC97C_ConfigureChannel(unsigned char channel, unsigned int cfg)
{
    SANITY_CHECK((channel == AC97C_CHANNEL_A) || (channel == AC97C_CHANNEL_B));

    if (channel == AC97C_CHANNEL_A) {

        AT91C_BASE_AC97C->AC97C_CAMR = cfg;
    }
    else {

        AT91C_BASE_AC97C->AC97C_CBMR = cfg;
    }
}

//------------------------------------------------------------------------------
/// Assigns the desired input slots to a particular channel.
/// \param channel  Channel number (or 0 to unassign slots).
/// \param slots  Bitfield value of slots to assign.
//------------------------------------------------------------------------------
void AC97C_AssignInputSlots(unsigned char channel, unsigned int slots)
{
    unsigned int value;
    unsigned int i;

    SANITY_CHECK(channel <= AC97C_CHANNEL_B);

    // Assign all slots
    slots >>= 3;
    for (i = 3; i < 15; i++) {

        // Check if slots is selected
        if (slots & 1) {

            value = AT91C_BASE_AC97C->AC97C_ICA;
            value &= ~(0x07 << ((i - 3) * 3));
            value |= channel << ((i - 3) * 3);
            AT91C_BASE_AC97C->AC97C_ICA = value;
        }
        slots >>= 1;
    }
}

//------------------------------------------------------------------------------
/// Assigns the desired output slots to a particular channel.
/// \param channel  Channel number (or 0 to unassign slots).
/// \param slots  Bitfield value of slots to assign.
//------------------------------------------------------------------------------
void AC97C_AssignOutputSlots(unsigned char channel, unsigned int slots)
{
    unsigned int value;
    unsigned int i;

    SANITY_CHECK(channel <= AC97C_CHANNEL_B);

    // Assign all slots
    slots >>= 3;
    for (i = 3; i < 15; i++) {

        // Check if slots is selected
        if (slots & 1) {

            value = AT91C_BASE_AC97C->AC97C_OCA;
            value &= ~(0x07 << ((i - 3) * 3));
            value |= channel << ((i - 3) * 3);
            AT91C_BASE_AC97C->AC97C_OCA = value;
        }
        slots >>= 1;
    }
}

//------------------------------------------------------------------------------
/// Returns 1 if no transfer is currently pending on the given channel;
/// otherwise, returns 0.
/// \param channel  Channel number.
//------------------------------------------------------------------------------
unsigned char AC97C_IsFinished(unsigned char channel)
{
    SANITY_CHECK(channel <= AC97C_CHANNEL_B_TRANSMIT);

	if (ac97c.transfers[channel].numSamples > 0) {

		return 0;
	}
	else {

		return 1;
	}
}

//------------------------------------------------------------------------------
/// Convenience function for synchronously sending commands to the codec.
/// \param address  Register address.
/// \param data  Command data.
//------------------------------------------------------------------------------
void AC97C_WriteCodec(unsigned char address, unsigned short data)
{
    unsigned int sample;

    sample = (address << 16) | data;
    AC97C_Transfer(AC97C_CODEC_TRANSFER, (unsigned char *) &sample, 1, 0, 0);
    while (!AC97C_IsFinished(AC97C_CODEC_TRANSFER));
}

//------------------------------------------------------------------------------
/// Convenience function for receiving data from the AC97 codec.
/// \param address  Register address.
//------------------------------------------------------------------------------
unsigned short AC97C_ReadCodec(unsigned char address)
{
    unsigned int sample;

    sample = AT91C_AC97C_READ | (address << 16);
    AC97C_Transfer(AC97C_CODEC_TRANSFER, (unsigned char *) &sample, 1, 0, 0);
	while (!AC97C_IsFinished(AC97C_CODEC_TRANSFER));

    return sample;
}
            
//------------------------------------------------------------------------------
/// Sets the size in bits of one sample on the given channel.
/// \param channel  Channel number.
/// \param size  Size of one sample in bits (10, 16, 18 or 24).
//------------------------------------------------------------------------------        
void AC97C_SetChannelSize(unsigned char channel, unsigned char size)
{
    unsigned int bits = 0;

    SANITY_CHECK((size == 10) || (size == 16) || (size == 18) || (size == 24));
    SANITY_CHECK((channel == AC97C_CHANNEL_A) || (channel == AC97C_CHANNEL_B));

    switch (size) {

        case 10 : bits = AT91C_AC97C_SIZE_10_BITS; break;
        case 16 : bits = AT91C_AC97C_SIZE_16_BITS; break;
        case 18 : bits = AT91C_AC97C_SIZE_18_BITS; break;
        case 20 : bits = AT91C_AC97C_SIZE_20_BITS; break;
    }

    if (channel == AC97C_CHANNEL_A) {

        AT91C_BASE_AC97C->AC97C_CAMR &= ~(AT91C_AC97C_SIZE);
        AT91C_BASE_AC97C->AC97C_CAMR |= bits;
    }
    else {

        AT91C_BASE_AC97C->AC97C_CBMR &= ~(AT91C_AC97C_SIZE);
        AT91C_BASE_AC97C->AC97C_CBMR |= bits;
    }
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲激情校园春色| 欧美亚洲一区二区在线观看| 91麻豆精品秘密| 日韩欧美国产不卡| 亚洲小少妇裸体bbw| 国产白丝精品91爽爽久久| 日韩一区二区在线观看视频播放| 樱花影视一区二区| 不卡一区二区三区四区| 久久久久久久综合日本| 日本免费新一区视频| 在线精品视频免费播放| 国产精品成人网| 国产一区二区精品在线观看| 欧美人妇做爰xxxⅹ性高电影 | 成人av免费在线观看| 欧美sm极限捆绑bd| 日本亚洲天堂网| 欧美情侣在线播放| 亚洲国产精品久久人人爱| 色婷婷亚洲婷婷| 综合激情网...| 99精品国产一区二区三区不卡| 久久久综合视频| 国产精品一区二区三区四区| 久久久一区二区| 国产精品 欧美精品| 久久久久97国产精华液好用吗| 精品综合久久久久久8888| 日韩你懂的在线观看| 蜜桃久久精品一区二区| 精品日韩欧美在线| 国产在线看一区| 久久精品一二三| 国产91露脸合集magnet| 日本一区二区动态图| 成人免费观看男女羞羞视频| 国产农村妇女精品| eeuss鲁一区二区三区| 亚洲视频免费看| 在线观看91视频| 香蕉加勒比综合久久| 欧美高清你懂得| 麻豆精品一二三| 欧美国产日韩一二三区| av在线一区二区| 一级中文字幕一区二区| 欧美日韩在线播放三区| 欧美a一区二区| 久久综合久久综合久久综合| 粉嫩aⅴ一区二区三区四区| 国产精品成人一区二区三区夜夜夜 | 国产精品1区2区3区在线观看| 久久精品夜色噜噜亚洲aⅴ| 成人黄色电影在线| 天天做天天摸天天爽国产一区| 日韩午夜中文字幕| 国产一区二区在线影院| 亚洲欧美视频一区| 欧美老肥妇做.爰bbww视频| 激情五月婷婷综合| 亚洲天堂中文字幕| 欧美一区二区三区免费视频| 国产伦精品一区二区三区在线观看 | 精品国产一区二区国模嫣然| 成人免费视频app| 香蕉加勒比综合久久| 国产亚洲精品7777| 欧美日韩视频在线第一区 | 久久精品国产成人一区二区三区| 欧美极品美女视频| 91精品国产综合久久精品图片| 精品一区二区在线看| 亚洲色大成网站www久久九九| 3d动漫精品啪啪一区二区竹菊| 国产伦精一区二区三区| 午夜亚洲福利老司机| 中文天堂在线一区| 欧美一区二区三区公司| 91在线精品一区二区三区| 青青草成人在线观看| 亚洲自拍偷拍综合| 国产日韩欧美精品综合| 欧美一区二区三区四区久久| 色婷婷av一区二区三区软件| 国产一区二区h| 奇米精品一区二区三区在线观看| 亚洲免费成人av| 久久亚区不卡日本| 欧美一二三在线| 欧美色老头old∨ideo| 成人国产精品视频| 国产传媒久久文化传媒| 五月综合激情婷婷六月色窝| 中文字幕一区日韩精品欧美| 国产欧美va欧美不卡在线| 日韩欧美激情四射| 69久久99精品久久久久婷婷 | 日韩欧美国产综合一区| 91免费视频网| 91丨porny丨在线| 成人免费视频视频在线观看免费| 久久99精品久久久久久| 蜜桃视频在线一区| 午夜精品久久久久久久蜜桃app| 亚洲欧洲日本在线| 国产精品美女www爽爽爽| 久久久久久电影| 久久丝袜美腿综合| 久久综合久久鬼色中文字| 欧美一级片免费看| 91精品欧美综合在线观看最新 | 99久久777色| www.日本不卡| a美女胸又www黄视频久久| 成人精品亚洲人成在线| 国产成人精品网址| proumb性欧美在线观看| 成人av网在线| 99国产欧美久久久精品| 色婷婷av一区二区三区gif| 欧美亚洲愉拍一区二区| 欧美日韩久久久一区| 欧美片网站yy| 日韩一区二区精品葵司在线| 日韩午夜小视频| 久久精品亚洲精品国产欧美kt∨| 久久久久久免费网| 国产精品乱子久久久久| 亚洲欧美日韩国产成人精品影院| 一区二区三区.www| 亚洲一区二区欧美日韩| 青青草91视频| 丁香五精品蜜臀久久久久99网站| 92国产精品观看| 欧美日韩黄视频| 精品对白一区国产伦| 中文字幕欧美日韩一区| 亚洲午夜羞羞片| 热久久久久久久| 成人精品在线视频观看| 欧洲生活片亚洲生活在线观看| 欧美一区日韩一区| 欧美—级在线免费片| 亚洲国产日韩a在线播放性色| 青青草精品视频| 不卡视频在线观看| 91麻豆精品国产无毒不卡在线观看| 亚洲精品在线一区二区| 亚洲色欲色欲www在线观看| 三级不卡在线观看| 国产成人精品网址| 在线播放国产精品二区一二区四区 | 免费xxxx性欧美18vr| 成人免费av资源| 欧美一区二区三区视频免费播放| 国产精品视频麻豆| 日本中文字幕不卡| 国产福利91精品| 欧美日韩精品一区二区三区四区| 久久久亚洲精华液精华液精华液 | 日韩一区二区三| 国产精品久久久久久福利一牛影视| 亚洲成人在线网站| 成人av动漫网站| 久久综合99re88久久爱| 亚洲国产一区在线观看| 99麻豆久久久国产精品免费| 精品少妇一区二区三区日产乱码 | 午夜精品一区二区三区免费视频| 国产精品99久久久久| 欧美一区二区三区视频免费播放 | 中文字幕一区二区三区不卡| 美女视频免费一区| 欧美日韩国产中文| 亚洲美女免费在线| 国产成人精品综合在线观看| 日韩欧美一级片| 亚洲国产精品一区二区尤物区| 成人黄色在线视频| 国产女人18水真多18精品一级做 | 色狠狠综合天天综合综合| 欧美一级片在线看| 婷婷激情综合网| 欧美自拍偷拍一区| 亚洲欧美激情视频在线观看一区二区三区| 国产一区二区三区精品欧美日韩一区二区三区 | 色婷婷av一区二区三区软件| 亚洲国产精品v| 韩国成人福利片在线播放| 欧美图区在线视频| 国产精品第一页第二页第三页| 国产精品 日产精品 欧美精品| 欧美大片一区二区| 免播放器亚洲一区| 日韩精品中文字幕在线不卡尤物| 日精品一区二区| 欧美一级高清片在线观看| 日韩av电影一区| 日韩欧美一级精品久久|