參考文章:
i2c_hard.c 檔案:
#include "i2c_hard.h"
static int i2c_timeout = 0;
void i2c1_port_init(void)
void i2c1_init(void)
/** * @brief 從i2c1匯流排上的某一器件的某一起始位址中讀取一定位元組的資料到陣列中
* @param number_bytes:要讀取的位元組數量(小於一頁)
* @param read_buffer:存放讀取資料的陣列指標
* @retval 是否讀取成功
*/i2c_status i2c1_read_nbytes(uint8_t driver_addr, uint8_t start_addr, uint8_t number_bytes, uint8_t *read_buffer)
} i2c_transferhandling(i2c1, driver_addr, 1, i2c_softend_mode, i2c_generate_start_write);
i2c_timeout = i2c_timeout;
while(i2c_getflagstatus(i2c1, i2c_flag_txis) == reset)
}i2c_senddata(i2c1, start_addr);
i2c_timeout = i2c_timeout;
while(i2c_getflagstatus(i2c1, i2c_flag_tc) == reset)
}i2c_transferhandling(i2c1, driver_addr, number_bytes, i2c_autoend_mode, i2c_generate_start_read);
for(read_num = 0; read_num < number_bytes; read_num++)
}read_buffer[read_num] = i2c_receivedata(i2c1);
} i2c_timeout = i2c_timeout;
while(i2c_getflagstatus(i2c1, i2c_flag_stopf) == reset)
}return i2c_ok;
}/**
* @brief 從i2c1的匯流排上的某一器件的某一起始位址中讀取一定位元組的資料到陣列中
* @param number_bytes:要讀取的位元組數量(小於一頁)
* @param write_buffer:存放讀取資料的陣列指標
* @retval 是否讀取成功
*/i2c_status i2c1_write_nbytes(uint8_t driver_addr, uint8_t start_addr, uint8_t number_bytes, uint8_t *write_buffer)
} i2c_transferhandling(i2c1, driver_addr, 1, i2c_reload_mode, i2c_generate_start_write);
i2c_timeout = i2c_timeout;
while(i2c_getflagstatus(i2c1, i2c_flag_txis) == reset)
}i2c_senddata(i2c1, start_addr);
i2c_timeout = i2c_timeout;
while(i2c_getflagstatus(i2c1, i2c_flag_tcr) == reset)
}i2c_transferhandling(i2c1, driver_addr, number_bytes, i2c_autoend_mode, i2c_no_startstop);
for(write_num = 0; write_num < number_bytes; write_num++)
}i2c_senddata(i2c1, write_buffer[write_num]);
} i2c_timeout = i2c_timeout;
while(i2c_getflagstatus(i2c1, i2c_flag_stopf) == reset)
}return i2c_ok;
}
i2c_hard.h 檔案:
#ifndef __i2c_hard_h__
#define __i2c_hard_h__
#include "stm32f0xx.h"
#include "delay.h"
#include "usart1.h"
#include "bsp.h"
#define i2c_timeout 2000
typedef enum
i2c_status;
void i2c1_port_init(void);
void i2c1_init(void);
i2c_status i2c1_read_nbytes(uint8_t driver_addr, uint8_t start_addr, uint8_t number_bytes, uint8_t *read_buffer);
i2c_status i2c1_write_nbytes(uint8_t driver_addr, uint8_t start_addr, uint8_t number_bytes, uint8_t *write_buffer);
#endif
但是注意,這裡的i2c1_read_nbytes和i2c1_write_nbytes函式中的driver_addr不是 7位格式的,需要將i2c器件的硬體位址左移1位,這也是我被坑之後用邏輯分析儀測出來的,下圖為位址左移後抓取的正確波形:
上述波形對應的程式:
i2c1_write_nbytes(0x68 << 1,0x75,1,&data); //mpu6050硬體位址0x68
STM32F030 硬體I2C驅動 AT24C16
網路上很多f1系列的atc24的讀寫程式,但f0幾乎沒有。由於f0完全重寫了i2c,所以以往的 並不能直接使用,修改事件 介面上會浪費很多時間,特別是對於使用f0系列進行入門的新手。在此十分感謝 暢學電子網 的對於at24c16的資料,特別是at24c16位址的解釋。除錯過程中這篇文章給了很大的幫助...
STM32F030開發環境搭建
長話短說,由於突然要除錯別人畫的一塊板子,用的是stm32f030除錯乙個adc.include stm32f0xx hal.h 這裡這個標頭檔案要放在其他標頭檔案前面,就是乙個順序問題。不然會報錯一堆未定義。這個問題可能以後編譯器會優化吧,目前先記著。然後需要編譯除錯。我只有dap link,但是...
STM32F030的IAP應用簡介
可以看到函式用了for迴圈將向量表拷貝到0 x20000000 sram的基位址,即將向量表由flash對映到了sram。所以在mdk裡面設定flash偏移位址的時候,同時要設定sram偏移位址。如下截圖 iap set void 函式 falsh address sram address 0x02...