//#include <stdarg.h>
//#include <stdio.h>
#include <avr/io.h>
#include <compat/twi.h>
#define SLAVE
unsigned char m=0;
/*-----串口初始化--------*/
void uart_init(void);
/*-----------------------*/
//发送采用查询方式
void put_char(unsigned char c);
void put_string(unsigned char *ptr); //指针输出,每输出一个字节将回车换行
void put_array(int *ptr);
//输出数组里指定的字节个数,在同一行显示。 全部输出后回车换行
void put_data(unsigned char *data, unsigned char bytes);
/*---------------------------*/
//void i2c_init(void);
//void i2c_sendstart(void);
//void i2c_sendEnd(void);
//void i2c_read(bool ack);
//void i2c_write(char data);
//
void i2c(void);
//
//void i2c_init(void)
//{
// // Set bit rate
// outb(TWBR,10); // See Note, Page 205 of ATmega128 docs
// // Enable TWI interrupts.
// outb(TWCR,((1 << TWINT) | (1 << TWIE)));
// sbi(TWCR, TWEN);
//}
//
//void i2c_sendstart(void)
//{
// // Direct TWI to send start condition.
// sbi(TWCR,TWSTA);
// sbi(TWCR,TWINT);
//}
//
//void i2c_sendEnd(void)
//{
// // Direct TWI to send stop condition
// sbi(TWCR,TWSTO);
// sbi(TWCR,TWINT);
// loop_until_bit_is_clear(TWCR,TWSTO);
//}
//
//void i2c_read(bool ack)
//{
// if (bit_is_clear(TWCR,TWINT))
// return FAIL;
//
// if (ack)
// sbi(TWCR,TWEA);
// else
// cbi(TWCR,TWEA);
//
// sbi(TWCR,TWINT); // Trigger the TWI
//}
//
//void i2c_write(char data)
//{
// if(bit_is_clear(TWCR,TWINT))
// return FAIL;
//
// outb(TWDR,data);
//
// sbi(TWCR,TWINT); // Trigger the TWI
//}
void i2c()
{
TWCR |= (1<<TWINT | 1<<TWEN | 1<<TWSTA);
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) != TW_START)
{
put_string("start");
}
TWDR = 0x50;
TWCR = (1<<TWINT) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) != TW_MT_SLA_ACK)
{
put_string("address");
}
// TWDR = m;
// TWCR = (1<<TWINT) | (1<<TWEN);
// while (!(TWCR & (1<<TWINT)));
// if ((TWSR & 0xF8) != TW_MT_DATA_ACK)
// {
// put_string("data");
// }
TWCR = (1<<TWINT)|(1<<TWEN) | (1<<TWSTO);
}
//-------------------------------------------------------------
void uart_init(void)
{
UCSR0B |=(1<<TXEN0)|(1<<RXEN0);//允许接收和发送
UBRR0L =51;
UBRR0H =0X00;//对8M晶振,设置波特率为9600
UCSR0C |=(3<<UCSZ00);//八位数据格式
}
//发送采用查询方式
void put_char(unsigned char c)
{
while(!(UCSR0A&(1<<UDRE0)));
UDR0=c;
}
void put_string(unsigned char *ptr) //指针输出,每输出一个字节将回车换行
{
while(*ptr)
{
put_char(*ptr);
ptr++;
}
put_char(0x0D);
put_char(0x0A);
}
void put_array(int *ptr) //在同一行上输出,不回车换行
{
while(*ptr)
{
put_char(*ptr);
ptr++;
}
}
//输出数组里指定的字节个数,在同一行显示。 全部输出后回车换行
void put_data(unsigned char *data, unsigned char bytes)
{
int i;
for(i=0; i<bytes; i++)
{
put_char(data[i]);
}
put_char(0x0D);
put_char(0x0A);
}
/*---------------------------*/
int main()
{
#ifdef SLAVE
uart_init();
TWBR = 10;
TWAR = 0x50;
TWDR = 0xFF; // Default content = SDA released.
TWCR = (1<<TWEN)| // Enable TWI-interface and release TWI pins.
(0<<TWIE)|(1<<TWINT)| // Disable TWI Interupt.
(1<<TWEA)|(0<<TWSTA)|(0<<TWSTO)| // Do not ACK on any requests, yet.
(0<<TWWC);
while(1)
{
if ((TWCR & 0x80) == 0x80)
{
//TWCR |= 1<<TWINT;
TWCR = (1<<TWEN)| // Enable TWI-interface and release TWI pins.
(0<<TWIE)|(1<<TWINT)| // Disable TWI Interupt.
(1<<TWEA)|(0<<TWSTA)|(0<<TWSTO)| // Do not ACK on any requests, yet.
(0<<TWWC);
put_char(TWDR);
}
else{
TWCR = (1<<TWEN)| // Enable TWI-interface and release TWI pins.
(0<<TWIE)|(1<<TWINT)| // Disable TWI Interupt.
(1<<TWEA)|(0<<TWSTA)|(0<<TWSTO)| // Do not ACK on any requests, yet.
(0<<TWWC);
}
}
#else
unsigned int i;
DDRA = 0x07;
PORTA = 0x07;
TWBR = 10;
TWSR |=0x03;
uart_init();
while(1){
for(i=0;i<=60000;i++);
for(i=0;i<=60000;i++);
put_string("running");
i2c();
m++;
}
#endif
}