?? comm_test.c
字號:
}
void led_write(unsigned int opcode_add, unsigned char data){
led_init();
LED_CS = 0;
unsigned char j;
for (j = 0; j < 16; j++)//發(fā)送控制字opcode_add;
{
SPISCK = 0;
if (opcode_add & 0x8000)//從高位發(fā)起;
SPISO = 1;
else
SPISO = 0;
DelayNmSec(DELAY);
SPISCK = 1;//上升沿有效;
DelayNmSec(DELAY);
opcode_add <<= 1;
}
for (j = 0; j < 8; j++)//發(fā)送字節(jié)data;
{
SPISCK = 0;
if (data & 0x80)//從高位發(fā)起;
SPISO = 1;
else
SPISO = 0;
DelayNmSec(DELAY);
SPISCK = 1;//上升沿有效;
DelayNmSec(DELAY);
data <<= 1;
}
LED_CS = 1;
return;
}
void led_config(void){
led_write(0x400A, 0xA0);
/*
配置芯片MCP23S17為與每個端口關(guān)聯(lián)的寄存器非配到不同的存儲區(qū),
禁止硬件順序操作,地址指針不遞增,禁止硬件地址引腳;
*/
led_write(0x4000, 0x00);
//配置端口A 的IO方向寄存器為全部輸出;
led_write(0x4010, 0x00);
//配置端口B 的IO方向寄存器為全部輸出;
}
void update_to_led(const unsigned char *data){
led_write(0x400A, *data);//將*data寫入PORTA中;
led_write(0x401A, *(data + 1));
//將*(data + 1)寫入PORTB中;
}
void InitUART2(unsigned int baudrate,unsigned char parity_check)
{
if(parity_check== PARITY_EVEN)
U2MODEbits.PDSEL=1;
else if(parity_check== PARITY_ODD)
U2MODEbits.PDSEL=2;
else
U2MODEbits.PDSEL=0x00;
//U2MODEbits.UARTEN = 1;
// baud rate
U2BRG = ((FCY/16)/baudrate) - 1;
/* clear IF flags */
IFS1bits.U2RXIF = 0;
IFS1bits.U2TXIF = 0;
/* set priority */
IPC7bits.U2RXIP = 6;
IPC7bits.U2TXIP = 5;
IEC1bits.U2RXIE = 0; //enable
IEC1bits.U2TXIE = 0; //disable
U2MODE = 0xC002;
//U2STA = 0x8550;
U2STA = 0x8550;
//Parity and Data Selection bits
// 11 = 9-bit data, no parity
// 10 = 8-bit data, odd parity
// 01 = 8-bit data, even parity
// 00 = 8-bit data, no parity
}
void ConfigIntUART2(void)
{
}
void __attribute__((__interrupt__)) _U2TXInterrupt(void)
{
while(U2STAbits.TRMT == 0);//當(dāng)發(fā)送移位寄存器為空時(U2STAbits.TRMT == 1)則數(shù)據(jù)已經(jīng)發(fā)送完畢;
IFS1bits.U2TXIF = 0;
}
// interrupt vector for UART2 RX interrupt
//
// 1)使用meterrx_str緩沖區(qū)和電表進行通訊,包括內(nèi)表,
// 2)使用rx_str緩沖區(qū)和232以及紅外口進行通迅,只接收幀報文,最大MAXTXSIZE字節(jié)
// 3)都使用meterrx_ptr為緩沖區(qū)指針
//
void __attribute__((__interrupt__)) _U2RXInterrupt(void)
{
IFS1bits.U2RXIF = 0; // clear interrupt flag
//rx_str[i++] = (unsigned char)U2RXREG;
while(U2STAbits.URXDA == 1)//已接收到數(shù)據(jù)
rx_str[i++] = (unsigned char)U2RXREG;
}
void __attribute__((__interrupt__)) _U1RXInterrupt(void)
{
float i1 = 0;
float i2 = 0;
float i3 = 0;
float i4 = 0;
float i5 = 0;
float i6 = 0;
float i7 = 0;
float i8 = 0;
float i9 = 0;
float i0 = 0;
float i11 = 0;
float i21 = 0;
float i31 = 0;
float i41 = 0;
float i51 = 0;
float i61 = 0;
float i71 = 0;
float i81 = 0;
float i91 = 0;
float i01 = 0;
float i111 = 0;
i1 = i11;
i2 = i21;
i3 = i31;
i4 = i41;
i5 = i51;
i6 = i61;
i7 = i71;
i8 = i81;
i9 = i91;
i0 = i01;
i11 = i111;
IFS0bits.U1RXIF = 0; // clear interrupt flag
DMA1_start(16);
DelayNmSec(5000);
//rx_str[i++] = (unsigned char)U2RXREG;
//while(U2STAbits.URXDA == 1)//已接收到數(shù)據(jù)
// rx_str[i++] = (unsigned char)U2RXREG;
}
void sendcharmeter(unsigned char data)
{
ClrWdt();
if(U2MODEbits.PDSEL == 3)
U2TXREG = data;
else
U2TXREG = data & 0xFF;
}
void enablePRG_232(void)
{
enableRxPRG232_LAT=0; //外部編程接口接收1(0--enable 1--disable)
enableTxPRG232_LAT=1; //外部編程接口發(fā)送(1--enable 0--disable)
DelayNmSec(1);
}
void enableinfraRed(void)
{
//enableTxInfra_dir = OUTPUT;//紅外發(fā)送控制引腳為輸出引腳;
enableTxInfra_LAT = 1;//0關(guān)閉紅外發(fā)送,1為打開紅外發(fā)送;
//enableRxInfra_dir = OUTPUT;//紅外接收控制引腳為輸出引腳;
enableRxInfra_LAT = 0;//1為關(guān)閉紅外接收,0為打開紅外接收;
}
//使能RS485通訊 發(fā)送
void enable485Send(void)
{
ch0enablesend = 1; //高電平可以發(fā)送
Nop();
Nop();
ch0enablerec_LAT = 1; //低電平不可以接收
}
void enable485Recv(void)
{
ch0enablesend = 0; //低電平不可以發(fā)送
Nop();
Nop();
ch0enablerec = 0; //低電平可以接收
}
void enablebuttomcomm(void)
{
enableTxMeter_LAT = 0;//1為關(guān)閉向內(nèi)置電表發(fā)送數(shù)據(jù),0為打開向內(nèi)置電表發(fā)送數(shù)據(jù);
Nop();
Nop();
enableRxMeter_LAT = 0;//1為關(guān)閉接收內(nèi)置電表數(shù)據(jù),0為打開接收內(nèi)置電表數(shù)據(jù);
}
void DMA0_init(void){
/****************************
DMA0中斷初始化
****************************/
IFS0bits.DMA0IF = 0;//清零DMA0的中斷標(biāo)志;
IPC1bits.DMA0IP = 7;//設(shè)置DMA0的中斷優(yōu)先級為7;
IEC0bits.DMA0IE = 1;//打開DMA0中斷服務(wù);
/****************************
DMA0基本參數(shù)設(shè)置
****************************/
DMA0REQ = 0x001F;//強制DMA0傳輸(使能以后才可以置1,但無法清零),使用U2TX為DMA0的中斷源;
//DMA0REQbits.FORCE = 1;
DMA0STA = (unsigned int)0x0000;//設(shè)置DMA0的主數(shù)據(jù)緩沖區(qū)的地址為0x4000,大小為1KB;
DMA0STB = (unsigned int)0x0400;//設(shè)置DMA0的輔數(shù)據(jù)緩沖區(qū)的地址為0x4400,大小為1KB;
DMA0PAD = (unsigned int)&U2TXREG;//設(shè)置與DMA通訊的外設(shè)緩存區(qū)的地址是寄存器U2TXREG的地址;
//DMA0CNT = 0x000f;//設(shè)置需要傳輸?shù)臄?shù)據(jù)的個數(shù)為2K個數(shù)據(jù)(字節(jié)或則是字);
/***************************************************************
設(shè)置DMA0模塊為關(guān)閉狀態(tài),數(shù)據(jù)傳輸格式為字節(jié)格式,寫入外設(shè),
數(shù)據(jù)塊傳輸完成中斷模式,正常寫模式,
尋址模式為帶后遞增模式,工作模式為連續(xù)數(shù)據(jù)塊非乒乓模式;
***************************************************************/
DMA0CON = 0x6000;
}
void DMA0_start(unsigned int len){
DMA0CNT = len - 1;
DMA0CONbits.CHEN = 1;
//U2TXREG = *DMA_RAM;
DMA0REQbits.FORCE = 1;
}
void _ISR _DMA0Interrupt(void){
IFS0bits.DMA0IF = 0;//清零DMA0的中斷標(biāo)志;
DMA0CONbits.CHEN = 0;//關(guān)閉DMA0通道;
}
void DMA1_init(void){
/****************************
DMA1中斷初始化
****************************/
IFS0bits.DMA1IF = 0;//清零DMA1的中斷標(biāo)志;
IPC3bits.DMA1IP = 7;//設(shè)置DMA1的中斷優(yōu)先級為7;
IEC0bits.DMA1IE = 1;//打開DMA1中斷服務(wù);
/****************************
DMA1基本參數(shù)設(shè)置
****************************/
DMA1REQ = 0x000c;//使用U1TX為DMA0的中斷源;
DMA1STA = (unsigned int)0x0000;//設(shè)置DMA1的主數(shù)據(jù)緩沖區(qū)的地址為0x4000,大小為1KB;
DMA1STB = (unsigned int)0x0400;//設(shè)置DMA1的輔數(shù)據(jù)緩沖區(qū)的地址為0x4400,大小為1KB;
DMA1PAD = (unsigned int)&U1TXREG;//設(shè)置與DMA通訊的外設(shè)緩存區(qū)的地址是寄存器U1TXREG的地址;
/***************************************************************
設(shè)置DMA1模塊為關(guān)閉狀態(tài),數(shù)據(jù)傳輸格式為字節(jié)格式,寫入外設(shè),
數(shù)據(jù)塊傳輸完成中斷模式,正常寫模式,
尋址模式為帶后遞增模式,工作模式為連續(xù)數(shù)據(jù)塊非乒乓模式;
***************************************************************/
DMA1CON = 0x6000;
}
void DMA1_start(unsigned int length){
DMA1CNT = length - 1;//設(shè)置傳輸數(shù)據(jù)塊長度;
DMA1CONbits.CHEN = 1;//打開DMA1通道;
DMA1REQbits.FORCE = 1;//觸發(fā)DMA1傳輸;
}
void _ISR _DMA1Interrupt(void){
IFS0bits.DMA1IF = 0;//清零DMA1的中斷標(biāo)志;
//DelayNmSec(2);
DMA1CONbits.CHEN = 0;//關(guān)閉DMA1通道;
}
int main(void){
unsigned int i = 0;
ClrWdt();
cpu_init();
LcmInit();
ClrWdt();
LcmClearTXT();
ClrWdt();
PutStr(0, 0, "************");
WriteCommand(0x0c);
ClrWdt();
led_init();
led_config();
led_control_word.port[0] = 0x06;
led_control_word.port[1] = 0x00;
update_to_led(led_control_word.port);
//ConfigIntUART2();
UART1_Init(9600, PARITY_NONE);
enablePRG_232();
for(i = 0;i < 1024; i++)
DMA_RAM[i] = i;
for(i = 1024;i < 2048; i++)
DMA_RAM[i] = 0xbb;
//DMA0_init();
DMA1_init();
//enableinfraRed();
//enable485Recv();
//enable485Send();
//enablebuttomcomm();
//sendcharmeter(0x68);
//DelayNmSec(5000);
// sendcharmeter(0x68);
//DMA0_start(16);
//DelayNmSec(3000);
//DMA1_start(16);
while(1);
DelayNmSec(3000);
unsigned char cs = (unsigned char)((unsigned char)0x68 + (unsigned char)0x99 + (unsigned char)0x99 + (unsigned char)0x99 + (unsigned char)0x99 + (unsigned char)0x99 + (unsigned char)0x68 + (unsigned char)0x01 + (unsigned char)0x02 + (unsigned char)0xff + (unsigned char)0xff);
/* enable/disable interrupt */
while(1)
{
sendcharmeter(0x68);
for(i=0;i<6;i++) sendcharmeter(0x99);
sendcharmeter(0x68);
sendcharmeter(0x01);
sendcharmeter(0x02);
sendcharmeter(0xFF);
sendcharmeter(0xFF);
sendcharmeter(cs);
sendcharmeter(0x16);
DelayNmSec(2000);
}
//U2STAbits.UTXEN = 0;
/*led_control_word.port[0] = 0xff;
led_control_word.port[1] = 0xff;
update_to_led(led_control_word.port);
*/
while(1);
return 0;
}
void UART1_Init(unsigned int baudrate, unsigned char parity_check)
{
U1MODEbits.UARTEN = 0; //禁止UART1
//中斷允許控制寄存器0 :0--禁止中斷請求; 1--允許中斷請求
IEC0bits.U1RXIE = 0;
IEC0bits.U1TXIE = 0;
//中斷標(biāo)志狀態(tài)寄存器0 :0--未產(chǎn)生中斷請求;1--產(chǎn)生中斷請求
IFS0bits.U1RXIF = 0;
IFS0bits.U1TXIF = 0;
//中斷優(yōu)先級控制寄存器2 :0~7 -- UART1接收優(yōu)先級位數(shù)
IPC2bits.U1RXIP = 6;
//中斷優(yōu)先級控制寄存器3 :0~7 -- UART1發(fā)送優(yōu)先級位數(shù)
IPC3bits.U1TXIP = 5;
/* enable/disable interrupt */
IEC0bits.U1RXIE = 1; //enable
IEC0bits.U1TXIE = 0; //disable
//波特率的設(shè)置
U1BRG = ((FCY/16)/baudrate) - 1;
//UART1模式寄存器
U1MODE = 0xC000; //使能UART1
//UART1狀態(tài)控制寄存器
U1STA = 0x8550;
if(parity_check== PARITY_EVEN)
U1MODEbits.PDSEL=1;
else if(parity_check== PARITY_ODD)
U1MODEbits.PDSEL=2;
else
U1MODEbits.PDSEL=0x00;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -