|
static void I2C_Delay(void)
{
volatile uint16_t t=0xff;
while(t--);
}
static void I2C_Start(void)
{
I2C_SDA_HIGH();
I2C_SCL_HIGH();
I2C_Delay();
I2C_SDA_LOW();
I2C_Delay();
I2C_SCL_LOW();
I2C_Delay();
}
static void I2C_Stop(void)
{
I2C_SDA_LOW();
I2C_SCL_HIGH();
I2C_Delay();
I2C_SDA_HIGH();
I2C_Delay();
}
static uint8_t I2C_WaitAck(void)
{
uint8_t Ack;
I2C_SDA_HIGH();
I2C_SCL_HIGH();
I2C_Delay();
if(I2C_SDA_Read())
Ack=1;
else
Ack=0;
I2C_SCL_LOW();
I2C_Delay();
return Ack;
}
/*
static void I2C_SendAck(void)
{
I2C_SDA_LOW();
I2C_Delay();
I2C_SCL_HIGH();
I2C_Delay();
I2C_SCL_LOW();
I2C_Delay();
}*/
static void I2C_SendNoAck(void)
{
I2C_SDA_HIGH();
I2C_Delay();
I2C_SCL_HIGH();
I2C_Delay();
I2C_SCL_LOW();
I2C_Delay();
}
static void I2C_SendByte(uint8_t Byte)
{
uint8_t Bit;
for(Bit=0;Bit<8;Bit++)
{
if(Byte&0x80)
I2C_SDA_HIGH();
else
I2C_SDA_LOW();
Byte<<=1;
I2C_Delay();
I2C_SCL_HIGH();
I2C_Delay();
I2C_SCL_LOW();
I2C_Delay();
}
}
static uint8_t I2C_ReceiveByte(void)
{
uint8_t Bit,Byte=0;
I2C_SDA_HIGH();
for(Bit=0;Bit<8;Bit++)
{
I2C_SCL_HIGH();
I2C_Delay();
Byte<<=1;
if(I2C_SDA_Read())
Byte++;
I2C_SCL_LOW();
I2C_Delay();
}
return Byte;
}
/******************************MMA7660FC******************/
uint8_t MMA7660_WriteByte(uint8_t Reg,uint8_t Data)//Reg MMA7660的寄存器地址 Data 寫進(jìn)寄存器的值
{
I2C_Start();
I2C_SendByte(MMA7660_Write);
if(I2C_WaitAck())
return 1;
I2C_SendByte(Reg);
if(I2C_WaitAck())
return 2;
I2C_SendByte(Data);
if(I2C_WaitAck())
return 3;
I2C_Stop();
return 0;
}
uint8_t MMA7660_ReadByte(uint8_t Reg,uint8_t *pData)
{
I2C_Start();
I2C_SendByte(MMA7660_Write);//MMA7660 的I2C寫地址
if(I2C_WaitAck())
return 1;
I2C_SendByte(Reg);
if(I2C_WaitAck())
return 2;
I2C_Start();
I2C_SendByte(MMA7660_Read);//MMA7660的I2C讀地址
if(I2C_WaitAck())
return 3;
*pData=I2C_ReceiveByte();
I2C_SendNoAck();
I2C_Stop();
return 0;
}
void MMA7660_Check(void)
{
I2C_Start();
I2C_SendByte(MMA7660_Write);
if(I2C_WaitAck())
{
put_str("mei you hui ying \n");
}
else
{
put_str("you hui ying \n");
}
I2C_Stop();
}
void Sys_Init(void)
{
CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
MMA7660_Init();
USART_Configuration();
}
uint8_t MMA7660_Configuration(void)
{
if(MMA7660_WriteByte(0x05,0xff))
return 1;
if(MMA7660_WriteByte(0x06,0x03))
return 2;
if(MMA7660_WriteByte(0x08,0x3c))
return 3;
if(MMA7660_WriteByte(0x09,0xe0))
return 4;
if(MMA7660_WriteByte(0x0a,0x00))
return 5;
if(MMA7660_WriteByte(0x07,0x59))
return 6;
return 0;
}
//想要獲取當(dāng)前的狀態(tài) 只需要調(diào)用 MMA7660_ReadByte() 讀取0x03 地址的數(shù)據(jù) 讀出來的數(shù)據(jù)中 [4:2]的數(shù)據(jù)才是有用數(shù)據(jù) 001 010 101 110 分別代表的是 左 右 下 上 .
|
|