?? text1.c
字號:
#include <AT91SAM7X256.H>
#include <lib_AT91SAM7X256.h>
typedef unsigned char uint8; //無符號8位整型變量
typedef unsigned short uint16;
#define uchar unsigned char
#define USART_INTERRUPT_LEVEL 7
#define AT91B_MCK (44236800) // Output PLL Clock (44 MHz)
/////////////////////////////////////////////////////
#define USART_BAUD_RATE 4800 //波特率
#define LONGSENT 11 //一楨數據長度 66 = 64(數據位) + 2 (校驗和);
#define BELL (1<<24) //蜂鳴器
uint8 sen_buf[LONGSENT] = {0x12,0x23,0x10,0x34,0x56,0x21,0xad,0xcf,0x00,0x00,0x6c}; //存儲待發送的數據和接收 PC機發送來得數據
/////////////////////////////////////////////////////////////////
char buf[LONGSENT],rcv_buf[LONGSENT]; //緩存PC機發送來得數據
int flag = 0,flag_rcv = 0; // 確定發送正確標志 //接收到完整字符串表制
uint16 buff_rx,compoint= 0;
AT91PS_USART COM0 ;
//*----------------------------------------------------------------------------
//* Function Name : Usart_c_irq_handler
//* Object : C handler interrupt function called by the interrupts
//* assembling routine
//*----------------------------------------------------------------------------
void Usart_c_irq_handler(void) __irq
{
AT91PS_USART USART_pt = COM0;
unsigned int status;
status = USART_pt->US_CSR ;
status &= USART_pt->US_IMR;
if ( status & AT91C_US_RXBUFF)
{
if (compoint<=LONGSENT)
{
buf[compoint] = USART_pt->US_RHR; //接收到一個字節邊產生中斷
}
if (compoint<LONGSENT)
{++compoint;}
COM0->US_RPR = (unsigned int) buff_rx;
COM0->US_RCR = 1;
if (compoint==(LONGSENT)) //接收PC機發送的數據
{
compoint = 0;
flag_rcv = 1;
}
if (compoint==6) //接收PC返回的確認信號
{
if ((buf[0] == 0x59) && (buf[1] == 0x45) && (buf[2] == 0x53)
&& (buf[3] == 0x21) && (buf[4] == 0x0D) && (buf[5] == 0x0A))//"YES!",
{
compoint = 0;
flag = 1;
}
}
}
if ( status & AT91C_US_TIMEOUT) //超時判斷
{
USART_pt->US_CR = AT91C_US_STTTO;
compoint = 0; //緩存字符串的數組的指針指向數組首地址
}
//* Reset the satus bit for error
USART_pt->US_CR = AT91C_US_RSTSTA;
*AT91C_AIC_EOICR = *AT91C_AIC_EOICR;
}
//----------------------------------------------------------------------------
void Usart_init ( void )
{
//-------------COM0-----------------------------
COM0= AT91C_BASE_US0;
//* Define RXD and TXD as peripheral
// Configure PIO controllers to periph mode
AT91F_PIO_CfgPeriph(
AT91C_BASE_PIOA, // PIO controller base address
((unsigned int) AT91C_PA0_RXD0 ) |
((unsigned int) AT91C_PA1_TXD0 ) , // Peripheral A
0 ); // Peripheral B
//* First, enable the clock of the PIOB
AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_US0 ) ;
//* Usart Configure
AT91F_US_Configure (COM0, AT91B_MCK,AT91C_US_ASYNC_MODE,USART_BAUD_RATE , 0);
//* Enable usart
COM0->US_CR = AT91C_US_RXEN | AT91C_US_TXEN; //
//* open Usart interrupt
AT91F_AIC_ConfigureIt (AT91C_BASE_AIC, AT91C_ID_US0, USART_INTERRUPT_LEVEL,
AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, 0x00);
AT91C_BASE_AIC->AIC_SVR[AT91C_ID_US0] = (int)Usart_c_irq_handler ;
AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_US0);
// Set the PDC
// AT91F_PDC_Open *(AT91C_BASE_PDC_US0);
COM0->US_RPR = (unsigned int) buff_rx;
COM0->US_RCR = 1;
COM0->US_RTOR = 10; //timeout set TO*4*bit_time
//* Enable USART IT error and AT91C_US_ENDRX
AT91F_US_EnableIt(COM0,AT91C_US_RXBUFF | AT91C_US_TIMEOUT );
// AT91F_US_EnableIt(COM0,AT91C_US_RXBUFF);
}
/*******************************************************************************
函數功能:計算校驗和(校驗位 = 楨序號 + 數據)楨最后2位為校驗和
返回值: 1:校驗成功
0:校驗失敗
*******************************************************************************/
uint8 check( char m[])
{
uint8 i = 0 ,sum = 0;
while(i < LONGSENT-2)
{
sum += m[i++] ;
}
if (sum == ( (m[LONGSENT-2] << 8) + m[LONGSENT-1] ))
return 1;
else
return 0;
}
/****************************************************************************
函數說明:rcv_buf[i]為接受字符串的數組
****************************************************************************/
void recive ()
{
//接收字符串
int i = 0;
while(i < LONGSENT)
{
rcv_buf[i] = buf[i]; //
i ++;
}
compoint = 0;
}
/******************************************************************************
主程序:循環發送數據,并檢測接收標志,如果檢測到開始存儲接收到的字符串
*******************************************************************************/
main()
{
uint16 time = 0;
Usart_init();
///////////////////////////////////////////////////////////////////
AT91F_PIO_CfgOutput(AT91C_BASE_PIOB, BELL); //關閉蜂鳴器
// AT91F_PIO_ClearOutput(AT91C_BASE_PIOB,BELL);
////////////////////////////////////////////////////////////////////
while(1)
{
/* 發送部分 */
if( check( sen_buf))
{
if ( !time )//首次發送某一字符串
AT91F_US_SendFrame(COM0,(char *)sen_buf,sizeof(sen_buf),0,0);
if (flag ) //發送成功
{
flag = 0;
///////////////////////////////////////////////////////////////////
//在數組char sen_buf[LONGSENT]中裝入新的即將發送的數據
///////////////////////////////////////////////////////////////////
}
time = 0;//沒有收到確認消息或裝載新的數據后繼續發送字符串
}
/* 接收部分 */
if( flag_rcv)
{
flag_rcv = 0;//清除標志
if (check( buf)) //驗證發送數據楨格式
recive();//接收字符串
}
} }
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -