msp430單片機(jī)模擬IIC總線讀取MMA7660三軸加速度傳感器
代碼如下:
file1 : main.c
#include "msp430G2452.h"
#include "g2452uart.h"
#include "MMA7660FC.h"
#define SDA_DirOut P2DIR |= BIT0
#define SDA_DirIn P2DIR &=~ BIT0
#define SDA_0 P2OUT &=~ BIT0
#define SDA_1 P2OUT |= BIT0
#define SCL_1 P2OUT |= BIT1
#define SCL_0 P2OUT &=~ BIT1
#define Get_Bit( x,y) ((x&(1< char X_value=0 ; char Y_value=0 ; char Z_value=0 ; signed char X_value_final,Y_value_final,Z_value_final; //三軸加速度的最終值,有正負(fù) { while(1); // If calibration constants erased // do not load, trap CPU!! } BCSCTL1 = CALBC1_1MHZ; // Set range DCOCTL = CALDCO_1MHZ; // Set DCO step + modulation */ void Port_Init() { } void delay_us( unsigned int k ) { } void IIC_Start() { } void IIC_Stop() { } void IIC_SendAck() { } void IIC_SendNAck() { SDA_1; } unsigned char IIC_RecAck() {
#define SDA_in Get_Bit(P2IN,0)
void OSC_Init()
{
WDTCTL=WDTPW+WDTHOLD;//close whatchdog
if (CALBC1_1MHZ ==0xFF || CALDCO_1MHZ == 0xFF)
//1Mhz
}
P2DIR |= BIT0+BIT1;
SDA_1;
SCL_1;
while(k--)
_nop();
SDA_1;
SCL_1;
delay_us(5);
SDA_0; //產(chǎn)生下降沿
delay_us(5);
SCL_0; //拉低時(shí)鐘線,準(zhǔn)備發(fā)送或者接收數(shù)據(jù)
SCL_1;
SDA_0;
delay_us(5);
SDA_1; //產(chǎn)生一個(gè)上升沿
delay_us(5);
SDA_0;
SCL_1;
delay_us(5);
SCL_0;
delay_us(5);
SCL_1;
delay_us(5);
SCL_0;
delay_us(5);
unsigned char CY ;
SDA_DirIn; //在接收模式下,設(shè)置SDA的方向?yàn)檩斎?/div> SCL_1; //拉高時(shí)鐘線 delay_us(5); //延時(shí) CY = SDA_in; //讀應(yīng)答信號 SCL_0 ; //拉低時(shí)鐘線 delay_us(5); //延時(shí) SDA_DirOut; //接收結(jié)束的時(shí)候還要吧SDA的方向切換過來 return CY; } unsigned char i ; for (i=0;i<8;i++) { if((data&0x80)?1:0) //分別發(fā)送每一位二進(jìn)制數(shù)據(jù) SDA_1; else SDA_0 ; SCL_1; data<<=1; //移位傳送下一位 } SDA_1; //8位數(shù)據(jù)位發(fā)送完釋放數(shù)據(jù)總線,同時(shí)SDA拉高 // IIC_Recevie(); //接收答信號
void IIC_WriteByte(unsigned int data)
{
delay_us(5);
SCL_0; //在SCL上升沿的時(shí)候加載一位的數(shù)據(jù)
delay_us (5);
}
unsigned char IIC_Read(void )
{
unsigned char i ,data=0;
SDA_DirIn; //在接收模式下,設(shè)置SDA的方向?yàn)檩斎?/div> IIC_WriteByte(SlaveAddress+0); //發(fā)送從機(jī)地址+寫入操作0 IIC_RecAck(); //應(yīng)答 IIC_WriteByte(REG_addr); //寫入內(nèi)部寄存器地址 IIC_WriteByte(REG_data); //寫入內(nèi)部寄存器數(shù)據(jù) IIC_RecAck(); IIC_Stop(); delay_us(5); unsigned char ReadFromAddr(unsigned char REG_addr) unsigned char RecData ; IIC_Start(); //啟動IIC總線 IIC_WriteByte(SlaveAddress+0); //寫入從機(jī)地址+寫命令0 IIC_WriteByte(REG_addr); //寫入要讀的內(nèi)部寄存器地址 IIC_Start(); IIC_WriteByte(SlaveAddress+1); //寫入從機(jī)地址+讀命令1 RecData=IIC_Read(); IIC_SendNAck(); IIC_Stop(); return RecData; X_value_final=(char)(X_value<<2); X_value_final =(char)(X_value_final /4); Y_value_final= (char)(Y_value<<2); Y_value_final = (char)(Y_value_final /4); Z_value_final= (char)(Z_value<<2); Z_value_final = (char)(Z_value_final /4);
for (i=0;i<8;i++)
{
SCL_0;
delay_us(5);
SCL_1 ; //SCL下降沿期間有數(shù)據(jù),當(dāng)SCL為高時(shí)數(shù)據(jù)線上的數(shù)據(jù)才有效
data<<=1;
data|=SDA_in;
delay_us(3);
}
SDA_DirOut; //接收結(jié)束的時(shí)候還要吧SDA的方向切換過來
return data;
}
void WriteToAddr(unsigned char REG_addr, unsigned char REG_data )
{
IIC_Start();
}
{
}
void MMA7660_Init()
{
WriteToAddr(MMA7660_MODE,0x01);
}
void Read3axle(void)
{
X_value=ReadFromAddr(X_outAddr);
Y_value=ReadFromAddr(Y_outAddr);
Z_value=ReadFromAddr(X_outAddr);
//將采集到的數(shù)據(jù)轉(zhuǎn)換到-32~31之間
}
關(guān)鍵詞:
msp430單片機(jī)模擬IIC總線MMA7660三軸加速度傳感
相關(guān)推薦
技術(shù)專區(qū)
- FPGA
- DSP
- MCU
- 示波器
- 步進(jìn)電機(jī)
- Zigbee
- LabVIEW
- Arduino
- RFID
- NFC
- STM32
- Protel
- GPS
- MSP430
- Multisim
- 濾波器
- CAN總線
- 開關(guān)電源
- 單片機(jī)
- PCB
- USB
- ARM
- CPLD
- 連接器
- MEMS
- CMOS
- MIPS
- EMC
- EDA
- ROM
- 陀螺儀
- VHDL
- 比較器
- Verilog
- 穩(wěn)壓電源
- RAM
- AVR
- 傳感器
- 可控硅
- IGBT
- 嵌入式開發(fā)
- 逆變器
- Quartus
- RS-232
- Cyclone
- 電位器
- 電機(jī)控制
- 藍(lán)牙
- PLC
- PWM
- 汽車電子
- 轉(zhuǎn)換器
- 電源管理
- 信號放大器
評論