?? uart_to_twi._c
字號(hào):
/*****************************************************************
//ICC-AVR application builder : 2005-8-19 14:40:53
// Target : M8
// Crystal: 7.3728Mhz
// Crystal: 4.6080Mhz
實(shí)驗(yàn):做usart串行通訊實(shí)驗(yàn)
目的:了解及會(huì)使用usart串口
CPU:atmega8L
相關(guān)的5個(gè)寄存器:UCSRA,UCSRB,UCSRC,UDR,UBRR(UBRRH,UBRRL)
其中:UBRRH和UCSRC共用一個(gè)地址
******************************************************************/
/*配置:CKOPT=0,CKSEL3..0=1111,SUT1..0=11(65ms慢速上升電源)*/
#include <iom8v.h>
#include <macros.h>
#define Fosc_4608 // 選擇4.608M晶振crystal
#define true 1
#define false 0
#ifdef Fosc_73728
#define baudrate 47 //波特率為9600b/s
//#define baudrate 191 //波特率為2400b/s
#endif
#ifdef Fosc_4608
//#define baudrate 29 //波特率為9600b/s
#define baudrate 119 //波特率為2400b/s
#endif
/* UART Buffer Defines */
#define UART_RX_BUFFER_SIZE 32
#define UART_TX_BUFFER_SIZE 32
unsigned char UART_RX_buff[UART_RX_BUFFER_SIZE];
unsigned char UART_TX_buff[UART_TX_BUFFER_SIZE];
unsigned char Temp;
unsigned char Tx_Flag,Rx_Flag;
unsigned char Error_Flag;
void main(void)
{
init_devices();
init_data();
while(1) //forever
{
if(Rx_Flag == true)
{
UDR = Temp;//start send
Temp = 0;
//Rx_Flag = false; //標(biāo)志位在發(fā)送成功后,再清零
}
if(Error_Flag == true)
{
if(Temp == 0x00)
Rx_Flag = false;
else
Rx_Flag = true;
}
}
}
void init_data(void)
{
Temp = 0x33;
Tx_Flag = false;
Rx_Flag = false;
Error_Flag = false;
}
#pragma interrupt_handler uart0_rx_isr:12
void uart0_rx_isr(void)
{
//uart has received a character in UDR
Temp = UDR;
Rx_Flag = true;
}
#pragma interrupt_handler uart0_udre_isr:13
void uart0_udre_isr(void)
{
//character transferred to shift register so UDR is now empty
//UDR = temp;//have sent and reload 發(fā)送完,and重裝
Error_Flag = true;
}
#pragma interrupt_handler uart0_tx_isr:14
void uart0_tx_isr(void)
{
//character has been transmitted
Rx_Flag = false;//說明已發(fā)送成功 send successfully
}
void port_init(void)
{
PORTB = 0x00;
DDRB = 0x00;
PORTC = 0x00; //m103 output only
DDRC = 0x00;
PORTD = 0x00;
DDRD = 0x00;
}
//UART0 initialize
// desired baud rate: 9600
// actual: baud rate:9600 (0.0%)
// char size: 8 bit
// parity: Disabled
void uart0_init(void)
{
UCSRB = 0x00; //disable while setting baud rate
//UCSRB[RXCIE,TXCIE,UDRIE,RXEN,TXEN,UCSZ2,RXB8,TXB8]
//Bit 7 – RXCIE: RX Complete Interrupt Enable
UCSRA = 0x00;
//UCSRA[RXC,TXC,UDRE,FE,DOR,PE,U2X,MPCM]
UCSRC = (BIT(URSEL)|BIT(UCSZ1)|BIT(UCSZ0));//設(shè)置成8位
//UCSRC[URSEL,UMSEL,UPM1,UPM0,USBS,UCSZ1,UCSZ0,UCPOL]
//位URSEL:寄存器選擇("1"為UCSRC或"0"為UBRRH)
//位UMSEL:工作模式選擇(0為異步,1為同步)
//位UPM1..0:為校驗(yàn)方式,硬件支持校驗(yàn)
//位USBS:停止位選擇(0為一位,1為兩位)
//位UCSZ0..2:發(fā)送位數(shù)選擇(如果是8位:011)
//位UCPOL:時(shí)鐘極性(只在同步模式使用,異步應(yīng)置為"0")
//UBRRL = 0x2F; //set baud rate lo
//UBRRH = 0x00; //set baud rate hi(設(shè)置波特率只用低四位,加起來一共12位)
UBRR = baudrate; /* set the baud rate */
UCSRB = ((1<<RXCIE)|(1<<TXCIE)|(1<<RXEN)|(1<<TXEN));
}
void twi_init(void)
{
TWCR = 0x00;
TWBR = 0x20;
TWSR = 0x00;
TWAR = 0x00;
TWCR = ((1<<TWEA)|(1<<TWEN));//TWINT???
//TWCR[TWINT,TWEA,TWSTA,TWSTO,TWWC,TWEN,-,TWIE]
}
//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
uart0_init();
twi_init();
MCUCR = 0x00;
GICR = 0x00;
TIMSK = 0x00; //timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -