如題
測了一下IO口的輸出電壓略小于3.3V
uj5u.com熱心網友回復:
附上程式//ICC-AVR application builder : 2009-3-12 17:05:04
// Target : M8
// Crystal: 8.0000Mhz
#include <avr/io.h>
#include <avr/interrupt.h>
#include <macros.h>
#include "usart.h"
void port_init(void)
{
DDRB|=0X04;//B2,LED_DOWN,PIN16
DDRC|=0X02;//C1,LED_LEFT,PIN24
DDRC|=0X08;//C3,LED_RIGHT,PIN26
DDRC|=0X20;//C5,LED_UP,PIN28
DDRB|=0X01;//B0,LED_OK,PIN14
DDRD|=0X40;//D6,TEST,PIN12
DDRC&=~0X01;//C0,KEY_LEFT,PIN23
DDRC&=~0X04;//C2,KEY_RIGHT,PIN25
DDRC&=~0X10;//C4,KEY_UP,PIN27
DDRB&=~0X02;//B1,KEY_DOWN,PIN15
DDRD&=~0X80;//D7,KEY_OK,PIN13
PORTC |= 0xFF;
PORTB |= 0xFF;
PORTD |= 0xFF;
}
//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
cli(); //disable all interrupts
port_init();
MCUCR = 0x00; //MCU Control Register
GICR = 0x00; //General Interrupt Control Register
TIMSK = 0x00; //timer interrupt sources
sei(); //re-enable interrupts
//all peripherals are now initialized
}
/*************************************************************************
用 途:iic發送接收
Taget :mega8
crystal :8M
介 紹:PC4-SDA
PC5-SCK/SCL
//***********************************************************************
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 0x3c //前4位器件固定,后三位看連線,最后1位是讀寫指令位
#define WD_DEVICE_ADDR 0x3d
#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
/*延時子程式*/
void delay_ms(int time)
{
int i;
for(;time>0;time--)
for(i=0;i<1000;i++);
}
//初始化
void iic_init()
{
TWBR= 0x20; //設定波特率
TWSR= 0x00; //設定預分頻比
TWCR= 0x44; //使能應答,使能TWI
DDRC|=(1<<PC4)|(1<<PC5);
PORTC|=(1<<PC4)|(1<<PC5);
}
/*********************************************
I2C總線寫一個位元組
回傳0:寫成功
回傳1:寫失敗
**********************************************/
unsigned char iic_write(unsigned char Wdata,unsigned char RegAddress)
{
Start(); //I2C啟動
Wait();
if(TestAck()!=START)
return 1; //ACK
Send_Char(0x11);//測驗用
Write8Bit(WD_DEVICE_ADDR); //寫I2C從器件地址和寫方式
Wait();
Send_Char(0x22);//測驗用
if(TestAck()!=MT_SLA_ACK)
return 1; //ACK
Send_Char(0x33);//測驗用
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_ms(100); //延時
return 0;
}
/*********************************************
I2C總線讀一個位元組
回傳非0:讀成功
回傳0:讀失敗
**********************************************/
unsigned char iic_read(unsigned RegAddress)
{
unsigned char 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()!=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;
}
//****************************************************************************
void main()
{
unsigned char i,j;
port_init();
init_devices();
usart_Init();
iic_init();
while(1)
{
;
}
}
uj5u.com熱心網友回復:
//ICC-AVR application builder : 2009-3-12 17:05:04// Target : M8
// Crystal: 8.0000Mhz
#include <avr/io.h>
#include <avr/interrupt.h>
#include <macros.h>
#include "usart.h"
void port_init(void)
{
DDRB|=0X04;//B2,LED_DOWN,PIN16
DDRC|=0X02;//C1,LED_LEFT,PIN24
DDRC|=0X08;//C3,LED_RIGHT,PIN26
DDRC|=0X20;//C5,LED_UP,PIN28
DDRB|=0X01;//B0,LED_OK,PIN14
DDRD|=0X40;//D6,TEST,PIN12
DDRC&=~0X01;//C0,KEY_LEFT,PIN23
DDRC&=~0X04;//C2,KEY_RIGHT,PIN25
DDRC&=~0X10;//C4,KEY_UP,PIN27
DDRB&=~0X02;//B1,KEY_DOWN,PIN15
DDRD&=~0X80;//D7,KEY_OK,PIN13
PORTC |= 0xFF;
PORTB |= 0xFF;
PORTD |= 0xFF;
}
//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
cli(); //disable all interrupts
port_init();
MCUCR = 0x00; //MCU Control Register
GICR = 0x00; //General Interrupt Control Register
TIMSK = 0x00; //timer interrupt sources
sei(); //re-enable interrupts
//all peripherals are now initialized
}
/*************************************************************************
用 途:iic發送接收
Taget :mega8
crystal :8M
介 紹:PC4-SDA
PC5-SCK/SCL
//***********************************************************************
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 0x3c //前4位器件固定,后三位看連線,最后1位是讀寫指令位
#define WD_DEVICE_ADDR 0x3d
#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
/*延時子程式*/
void delay_ms(int time)
{
int i;
for(;time>0;time--)
for(i=0;i<1000;i++);
}
//初始化
void iic_init()
{
TWBR= 0x20; //設定波特率
TWSR= 0x00; //設定預分頻比
TWCR= 0x44; //使能應答,使能TWI
DDRC|=(1<<PC4)|(1<<PC5);
PORTC|=(1<<PC4)|(1<<PC5);
}
/*********************************************
I2C總線寫一個位元組
回傳0:寫成功
回傳1:寫失敗
**********************************************/
unsigned char iic_write(unsigned char Wdata,unsigned char RegAddress)
{
Start(); //I2C啟動
Wait();
if(TestAck()!=START)
return 1; //ACK
Send_Char(0x11);//測驗用
Write8Bit(WD_DEVICE_ADDR); //寫I2C從器件地址和寫方式
Wait();
Send_Char(0x22);//測驗用
if(TestAck()!=MT_SLA_ACK)
return 1; //ACK
Send_Char(0x33);//測驗用
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_ms(100); //延時
return 0;
}
/*********************************************
I2C總線讀一個位元組
回傳非0:讀成功
回傳0:讀失敗
**********************************************/
unsigned char iic_read(unsigned RegAddress)
{
unsigned char 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()!=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;
}
//****************************************************************************
void main()
{
unsigned char i,j;
port_init();
init_devices();
usart_Init();
iic_init();
i=iic_write(0xaa,0X10);//在0X10地址寫入資料0XAA
if (i==1)
PORTB=0x1;//若寫入失敗(i=1),B口0x01;若寫入成功,B口輸出0X02
else
PORTB=0x2;
j=iic_read(0X10);//讀出0x10地址的資料
if(j==1)
PORTD=0xff; //若讀出失敗(j=1),D口全滅;若讀出成功,D口輸出0XAA
else
PORTD=j;
while(1)
{
;
}
}
uj5u.com熱心網友回復:
是下面一個程式,第一個貼錯了~uj5u.com熱心網友回復:
先降速 波形圖看一下,建立時間保持時間是否足夠uj5u.com熱心網友回復:
現在是這樣的 I2C通信正常,能夠收到應答信號
但是GY273的資料暫存器不能讀取,我結合手冊和現象,能判斷出是 資料沒準備好,就被讀取了,直接清零
這個有什么解決辦法嗎?
uj5u.com熱心網友回復:
這個沒準備好是有啥使能位沒開?轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/98688.html
標籤:嵌入開發(WinCE)
下一篇:can 控制器開發
