簡體   English   中英

使用運算符進行I2c操作

[英]Using operators for I2c operations

我有一個STM32F2控制器和一個FRAM設備FM24V10-G通過I2C連接到它。 通常,為了與I2C設備通信,我使用了一個基於libopencm3的庫。 但是,使用FRAM需要稍微不同的I2C操作順序(如發送開始,7位地址等),這意味着我不能使用標准庫函數,如讀取和寫入,這有助於我使用其他I2C設備。 在這個庫中,I2C作為一個類實現,它有流操作符重載,以便以所需的順序發送這些I2C命令。

例如:

I2c& I2c::operator<< (operation_t operation)
{
    switch (operation) {
        case Start:
            i2c_send_start(_reg);
            while (!checkEvent(SR2(I2C_SR2_BUSY | I2C_SR2_MSL) | I2C_SR1_SB));
            break;
        case Stop:
            i2c_send_stop(_reg);
            break;
        case Wait_End:
            while (!checkEvent(I2C_SR1_TxE));
            break;
    return *this;
}

有時,其中一些命令無法執行,導致CPU等待某些標志(如Wait_End的情況),從而阻止整個系統運行。

所以這是我的問題:有沒有辦法在上面的代碼中返回某種超時標志? 對我來說,讓系統始終運行至關重要,如果I2C操作失敗並且達到超時就跳過一個命令就可以了。

感謝所有正在閱讀此內容的人!

你可以像這樣做一個非常基本的超時:

I2c& I2c::operator<< (operation_t operation)
{
    int count = 0;
    const int TIMEOUT = 4242;
    switch (operation) {
        case Start:
            i2c_send_start(_reg);
            while (!checkEvent(SR2(I2C_SR2_BUSY | I2C_SR2_MSL) | I2C_SR1_SB) 
                    && count != TIMEOUT) {
                count++;
            }
            break;
        case Stop:
            i2c_send_stop(_reg);
            break;
        case Wait_End:
            while (!checkEvent(I2C_SR1_TxE) && count != TIMEOUT) {
                count++;
            }
            break;
    }
    if (count == TIMEOUT) {
        //error handling
        return -1;
    }
    return *this;
}

當然,如果您需要准確的超時並且不希望浪費處理時間來增加count變量,則應使用硬件計時器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM