?? i2c._h
字號:
#include <macros.h>
#include "delay.h"
//使用AVR內部硬件iic,引腳定義
//PC0->SCL ; PC1->SDA
//I2C 狀態定義
//MT 主方式傳輸 MR 主方式接受
#define START 0x08
#define RE_START 0x10
#define MT_SLA_ACK 0x18
#define MT_SLA_NOACK 0x20
#define MT_DATA_ACK 0x28
#define MT_DATA_NOACK 0x30
#define MR_SLA_ACK 0x40
#define MR_SLA_NOACK 0x48
#define MR_DATA_ACK 0x50
#define MR_DATA_NOACK 0x58
#define RD_DEVICE_ADDR 0x3D
#define WD_DEVICE_ADDR 0x3C
//常用TWI操作(主模式寫和讀)
#define Start() (TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)) //啟動I2C
#define Stop() (TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN)) //停止I2C
#define Wait() {while(!(TWCR&(1<<TWINT)));} //等待中斷發生
#define TestAck() (TWSR&0xf8) //觀察返回狀態
#define SetAck (TWCR|=(1<<TWEA)) //做出ACK應答
#define SetNoAck (TWCR&=~(1<<TWEA)) //做出Not Ack應答
#define Twi() (TWCR=(1<<TWINT)|(1<<TWEN)) //啟動I2C
#define Write8Bit(x) {TWDR=(x);TWCR=(1<<TWINT)|(1<<TWEN);} //寫數據到TWDR
unsigned char I2C_Write(unsigned char RegAddress,unsigned char Wdata);
unsigned int I2C_Read(unsigned RegAddress);
/*********************************************
I2C總線寫一個字節
返回0:寫成功
返回1:寫失敗
**********************************************/
unsigned char I2C_Write(unsigned char RegAddress,unsigned char Wdata)
{
Start(); //I2C啟動
Wait();
if(TestAck()!=START)
return 1; //ACK
Write8Bit(WD_DEVICE_ADDR); //寫I2C從器件地址和寫方式
Wait();
if(TestAck()!=MT_SLA_ACK)
return 1; //ACK
Write8Bit(RegAddress); //寫器件相應寄存器地址
Wait();
if(TestAck()!=MT_DATA_ACK)
return 1; //ACK
Write8Bit(Wdata); //寫數據到器件相應寄存器
Wait();
if(TestAck()!=MT_DATA_ACK)
return 1; //ACK
Stop(); //I2C停止
delay_nms(10); //延時
return 0;
}
/*********************************************
I2C總線讀一個字節
返回0:讀成功
返回1:讀失敗
**********************************************/
unsigned int I2C_Read(unsigned RegAddress)
{
unsigned int temp;
Start();//I2C啟動
Wait();
if (TestAck()!=START)
return 1; //ACK
Write8Bit(WD_DEVICE_ADDR); //寫I2C從器件地址和寫方式
Wait();
if (TestAck()!=MT_SLA_ACK)
return 1; //ACK
Write8Bit(RegAddress); //寫器件相應寄存器地址
Wait();
if (TestAck()!=MT_DATA_ACK)
return 1;
Start(); //I2C啟動
Wait();
if(TestAck()!=START)
return 1; //ACK
Write8Bit(RD_DEVICE_ADDR); //寫I2C從器件地址和寫方式
Wait();
if(TestAck()!=MR_SLA_ACK)
return 1; //ACK
Twi(); //啟動主I2C讀方式
TWCR = 0xC4; //清中斷標志,結果應答ACK
Wait();
temp=TWDR; //讀取I2C接收數據 第一字節
Twi(); //啟動主I2C讀方式,結果應答NO_ACK
Wait();
temp = (temp<<8)+TWDR; //讀第二字節 合成16位數值
Stop(); //I2C停止
return temp;
/*
Start(); //I2C重新啟動
Wait();
if (TestAck()!=RE_START)
return 1;
Write8Bit(RD_DEVICE_ADDR); //寫I2C從器件地址和讀方式
Wait();
if(TestAck()!=MR_SLA_ACK)
return 1; //ACK
Twi(); //啟動主I2C讀方式
Wait();
if(TestAck()!=MR_DATA_NOACK)
return 1; //ACK
temp=TWDR;//讀取I2C接收數據
Stop();//I2C停止
return temp;
*/
}
/*********************************************
I2C總線讀一個字節
返回:16位數值
*********************************************
unsigned int I2C_Read()
{
unsigned int temp;
}*/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -