這是我最近找到的三軸加速度MMA8451的中文手冊和操作流程,現在發上來分享給大家
MMA8451三軸加速度傳感器,16引腳,QFN封裝,數字I2C輸出,8位/14位精度可選,量程 2g/ 4g/ 8g可選,電源供電1.95v~3.6v可選。輸出數據速率從1.56到800Hz。有兩個可編程的中斷引腳,7個中斷源?蓹z測自由落體、運動、脈沖、振動等、傾角等。 32個采樣FIFO,每次采樣都通過高通濾波后傳入FIFO。 典型應用有:電子羅盤,靜態姿態、運動檢測,筆記本電子書等便攜設備的翻滾、自由落體檢測,實時的方向檢測可用于虛擬現實設備或3d游戲中的位置檢測,便攜設備的節能應用中的運動檢測等等。 芯片外形 不同姿態下X、Y、Z三軸對應的重力輸出 典型連接 引腳定義如下: 靈敏度由count/g表示,2g量程下,可達4096/g,4g量程下,可達2048/g,8g量程下,可達1024/g MMA8451狀態轉換圖 MMA8451內部框圖,分為數字部分和模擬部分 在OFF模式下,數字部分和模擬部分都不工作 在STANDBY模式下,IIC通信照常進行,但模擬模塊被禁止,內部時鐘停止 在ACTIVE模式下(WAKE或SLEEP),IIC通信照常進行,數字和模擬模塊都正常工作 I2C串行通信 MMA8451使用I2C串行通信和外部交換數據,MMA8451可通過中斷信號指示新的采樣序列可用,也可通過設置使用中斷信號指示設備的移動、自由落體、瞬變、方向、單/雙擊。 I2C總線使用三根信號線進行通信,分別是SCL、SDA和SA0,外部上拉電阻需要將SDA和SCL接到VDDIO上,當總線空閑時,這兩根線表現為高電平狀態。MMA8451的I2C接口可工作在快速模式400KHz或普通模式100KHz。 總線傳輸開始由START信號觸發,START信號定義為,當數據線從高電平跳變到低電平,而時鐘線SCL仍然保持高電平。由主機發送START信號過后,I2C總線被認為從空閑(free)狀態進入忙(busy)狀態。緊接著START信號后主機發送的字節,前7位用于指示從機地址,第8位用于指示數據方向是讀出(1數據從從機到主機)還是寫入(0數據從主機到從機)。地址發送完畢后,總線上的所有從機將自己的地址和總線上接收到的地址進行比較,地址匹配的設備即為主機選中設備。第9個脈沖為應答響應,發送設備必須在這個ACK周期內釋放數據線,而接收設備則需要在ACK周期的時鐘高電平期間將數據線拉低。 SCL 線是高電平時,SDA 線由低電平向高電平切換,這個情況表示停止條件。停止條件將終止發送器的發送。 主機也可重復發出起始(START)條件,對于MMA8451,重復的起始條件可用于讀取一些特殊的寄存器。 MMA8451的地址被設置為0x1c或0x1d,可用引腳7(SA0)的高低電平來選擇。當SA0為高電平時,0x1d地址被選中有效,當SA0為低電平時,0x1c地址被選中有效。 重點概念: START條件:時鐘線SCL為高電平期間,數據線從高電平跳變到低電平 START代碼,使用IO口模擬IIC /******************************************* I2C START信號 時鐘脈沖高電平期間,數據線負跳變 ********************************************/ void IIC_start(void) { IIC_SCL=0;//時鐘線低 IIC_SDA=1;//數據線高 _asm(nop); IIC_SCL=1;//時鐘線高 _asm(nop); IIC_SDA=0;//數據線從高跳變到低 _asm(nop); IIC_SCL=0;//時鐘線低 } STOP條件: 時鐘線SCL為高電平期間,數據線從低電平跳變到高電平 /******************************************* I2C STOP信號 時鐘脈沖高電平期間,數據線正跳變 ********************************************/ void IIC_stop(void) { IIC_SCL=0;//時鐘線低 _asm(nop); IIC_SDA=0;//數據線低 _asm(nop); IIC_SCL=1; //時鐘線高 _asm(nop); IIC_SDA=1;//數據線正跳變 _asm(nop); IIC_SCL=0;//時鐘線低 } ACK:確認,由地址匹配成功的從機在第9個脈沖周期內發出,這時主機釋放數據線,從機在時鐘高電平期間將數據線置為低電平。 MMA8451的I2C操作: 主機發送START,緊接著主機給出7位地址(0x1d或0x1c),并置第8位為0,表示數據從主機到從機。從機匹配地址后,返回確認ACK信號,接著主機傳輸8位寄存器地址,從機返回確認ACK。主機再次發出START,并給出7位從機地址,并置第8位為1,表示數據從從機到主機,從機確認后返回8位寄存器數據。主機不確認,并發出STOP。 注意:除了START,STOP,ACK以外,其它數據在時鐘高電平期間必須維持不變。 單個字節讀時序 主機發送八位數據或地址代碼如下(使用IO口模擬) //************************************************* //字節發送程序 //發送c(可以是數據也可是地址),送完后接收從應答 //不考慮從應答位 void send_byte(unsigned char c) { unsigned char i; for(i=0;i<8;i++) { IIC_SCL=0; if((c<<i) & 0x80)IIC_SDA=1; //發送1 else IIC_SDA=0; //發送0 _asm(nop); IIC_SCL=1;//時鐘高電平 _asm(nop); IIC_SCL=0;//時鐘低電平 } _asm(nop);//第9個脈沖 IIC_SDA=1; //發送完8bit,釋放總線準備接收應答位 _asm(nop); IIC_SCL=1; _asm(nop); //sda上數據即是從應答位 IIC_SCL=0; //不考慮從應答位,但要控制好時序 } **注意:發送設備地址時,MMA8451地址為0011100(0x1c,SA0=0)或0011101(0x1d,SA0=1),可將SA0引腳直接接地或接高電平,以接高電平為例,地址為7位,高位在前,地位在后,第8位為數據方向選擇,若后續數據為主機到從機,則為0,若后續數據為從機到主機,則為1。 以單個字節讀為例,地址設為0x1d,見時序圖,START信號過后,則應發送00111010,即0x3A 可先如下定義,#define MMA8451_ADD 0X3A 第二次發送地址,則后續數據為從機到主機,第8位為1,可發送MMA8451_ADD+1即可
多字節讀和單字節讀基本相同,如果讀完單字節后,主機不發送NAK和STOP,并對從機響應AK,則從機設備會自動將主機發送的寄存器地址加1,并發送對應的寄存器內容,直到主機響應NAK和STOP。
主機響應AK或NAK程序代碼如下 //************************************************ //主應答(包含ack:SDA=0和no_ack:SDA=1) //入口參數:ack_main:1,應答ack,0,無需應答nak //注:ack:scl高電平期間,數據線低 // nak:scl高電平期間,數據線高 void IIC_ack_main(unsigned char ack_main) { IIC_SCL=0; if(ack_main)IIC_SDA=0; //ack主應答 else IIC_SDA=1; //no_ack無需應答 _asm(nop); IIC_SCL=1; _asm(nop); IIC_SCL=0; }
單個字節寫入和單個字節讀略有不同,區別在于發送為寄存器地址后,主機不再重復發送START信號和設備地址,而是直接給出寫入的數據。代碼如下: 多個字節寫和單個字節寫類似,只要主機發送STOP信號,則可以連續寫入,寫入的寄存器地址自動增加。
MMA8451寄存器: - 狀態寄存器STATUS/F_STATUS 地址0x00
- 控制寄存器CTRL_REG1,地址0x2a
ASLP_RATE[1:0]:設置睡眠模式采樣頻率,默認00 DR[2:0]:數據速率選擇。默認為000,800Hz 注意:當設備在睡眠模式下,數據輸出速率以ASLP_RATE[1:0]為準,DR設置速率無效。 LNOISE:
- XYZ數據設置寄存器XYZ_DATA_CFG,地址0x0e
HPF_OUT:高通濾波器數據輸出使能。 HPF_OUT=1:使能; HPF_OUT=0:禁止。 FS1:FS0:XYZ量程設置。 如下表所示:
完整的Word格式文檔51黑下載地址:
|