【實驗目的】
學習STM32的M0系列芯片的使用
學習MDK開發軟件的使用方法,如仿真調試
通過本實驗掌握stm32F0xx的I2C使用方法
【實驗環境】
Wi-Fi三軸傳感器模塊
MDK開發工具和相應的仿真器
PC機 XP、Window7/8
【實驗內容】
編寫三軸傳感器實驗程序,實現STM32F0xx模擬I2C采集三軸的實時數據,并與第三章節一樣在PC端顯示相應的數據。
【實驗原理】
在STM32模塊中,硬件上連接了一個三軸加速度傳感器。通過設置硬件連接及軟件操作,可以利用三軸加速度獲取x、y、z軸3個方向上的加速度信息。
開發板上使用的是MMA7455L加速度傳感器,它輸出的是數字信號,有低通濾波、溫度補償、自我測試,可配置為通過中斷引腳(INT0與INT1)檢測0g,并且對快速的移動進行檢測等特點。
通過向傳感器的控制寄存器中寫入不同的內容,可以配置該傳感器工作在不同的模式上,比如自測模式、待機模式、測試模式、加速度選擇模式。可以通過I2C總線或者使用SPI總線來讀取傳感器的數字輸出。在STM32模塊上,使用的是模擬I2C總線來實現數據的讀取。
MMA7455L傳感器只在從機模式下進行工作,設備地址為$1D,支持多字節的讀/寫模式。不支持Hs模式、10位尋址模式和起始字節模式。在進行單字節的讀取時,首先主機(微控制器)會向傳感器發出一個開始信號,然后是從機地址,讀/寫位寫入"0"表示這是一個寫操作。MMA7455L會發出一個應答信號。下面主機傳送一個用于讀取操作的8位的寄存器地址,然后傳感器會返回一個應答。主機也可以發送一個重復的開始信號,而后以尋址傳感器來讀取先前選擇的寄存器,從機就會應答并傳送數據。等到數據接收之后,主機就會傳送一個停止信號。 除此之外,還可以選擇多字節讀和單字節寫的模式。
STM32模塊開發平臺上MMA7455L與MCU連接原理圖:

圖 三軸傳感器原理圖
STM32的PA_2引腳與模塊的時鐘引腳相連,PA_1引腳與模塊的數據引腳相連。運用stm32的GPIO引腳的模擬讀取I2C的時序。
【實驗步驟】
完成第3章節"RealView MDK4.22a集成開發環境",就可以做傳感器實驗了,首先打開光盤中的傳感器工程文件。
工程源碼路徑:華清遠見-網絡拓撲圖資料光盤\無線傳感模塊\低功耗Wi-Fi部分-STM32F051\程序源碼\STM23F051 加速度度傳感器(模擬i2c)\MDK-ARM

編譯下載超聲波程序(先編譯后下載)
如果需要調試的話,應先下載程序,再點擊右上方的調試按鈕進入調試界面。

實物連接:

圖 實物連接
上圖連接說明,AP模式的Wi-Fi是通過串口直接和PC機相連接。串口Wi-Fi接收到數據,以串口的形式輸出到PC的串口調試助手上顯示。
【實驗結果】
利用串口調試工具做實驗,打開串口調試工具,波特率115200、串口號(你的電腦的端口號)、點擊打開。
接收到的數據如下,

可以通過串口發送21 57 01 00 41 01 ff 00 00 00 1F F6控制繼電器的開。
21 51: 為字符'!W'
01 00 :設備地址 注意:01為低八位地址,00為高八位地址
41 :設備類型 'A' ,是三軸傳感器
01 ff 00: 讀到的三軸數據x/y/z。三軸值有正負之分
1F:當前電量
F6 :校驗和。
【實驗參考代碼】
Mian.c
COBOL Code
int main(void)
{
uint8_t ReadValue,i;
uint8_t buf[11]={0};
SystemInit(); //系統時鐘初始化
/* Configure LED6 */
STM_EVAL_LEDInit(LED6);
Systick_Init();//滴答定時初始化
/* Initiate Blink Speed variable */
BlinkSpeed = 1;
GPIO_Configuration_Init();
USART_Cfig_Init(); //串口初始化
I2C_init(); //I2C 初始化
TIM_INT_Config();
MM7455_Init();
buf[0] = 0x21;
buf[1] = 'W';
buf[2] = 0x01;
buf[3] = 0x00;
buf[4] = 'A';
/* Assume base board in zero-g position when reading first value. */
Axis3_Test(&x, &y, &z);
xoff = 0-x;
yoff = 0-y;
zoff = 0-z;
while(1)
{
Delay(1000);
Axis3_Test(&x, &y, &z); //讀取三軸的XYZ的值
x = x+xoff;
y = y+yoff;
z = z+zoff;
buf[5] = x;
buf[6] = y;
buf[7] = z;
for(i=0; i<(11-2);i++)
{
ReadValue ^=buf[i+1];
}
buf[10] = ReadValue;
UART_Send(USART2,buf, 11);
Delay(1000);
}
}
讀取I2C芯片的數據函數
COBOL Code
void Axis3_Test(int8_t *x, int8_t *y, int8_t *z)
{
uint8_t Read_buf;
/* wait for ready flag */
while ((getStatus() & ACC_STATUS_DRDY) == 0);
/*
* Have experienced problems reading all registers
* at once. Change to reading them one-by-one.
*/
I2C_Read_one_Byte(&Read_buf, ACC_ADDR_XOUT8, MMA_ADRESS);
*x = (int8_t)Read_buf;
I2C_Read_one_Byte(&Read_buf, ACC_ADDR_YOUT8, MMA_ADRESS);
*y = (int8_t)Read_buf;
I2C_Read_one_Byte(&Read_buf, ACC_ADDR_ZOUT8, MMA_ADRESS);
*z = (int8_t)Read_buf;
}