📄 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++)//发送控制字opcode_add;
{
SPISCK = 0;
if (opcode_add & 0x8000)//从高位发起;
SPISO = 1;
else
SPISO = 0;
DelayNmSec(DELAY);
SPISCK = 1;//上升沿有效;
DelayNmSec(DELAY);
opcode_add <<= 1;
}
for (j = 0; j < 8; j++)//发送字节data;
{
SPISCK = 0;
if (data & 0x80)//从高位发起;
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为与每个端口关联的寄存器非配到不同的存储区,
禁止硬件顺序操作,地址指针不递增,禁止硬件地址引脚;
*/
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);//当发送移位寄存器为空时(U2STAbits.TRMT == 1)则数据已经发送完毕;
IFS1bits.U2TXIF = 0;
}
// interrupt vector for UART2 RX interrupt
//
// 1)使用meterrx_str缓冲区和电表进行通讯,包括内表,
// 2)使用rx_str缓冲区和232以及红外口进行通迅,只接收帧报文,最大MAXTXSIZE字节
// 3)都使用meterrx_ptr为缓冲区指针
//
void __attribute__((__interrupt__)) _U2RXInterrupt(void)
{
IFS1bits.U2RXIF = 0; // clear interrupt flag
//rx_str[i++] = (unsigned char)U2RXREG;
while(U2STAbits.URXDA == 1)//已接收到数据
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)//已接收到数据
// 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; //外部编程接口发送(1--enable 0--disable)
DelayNmSec(1);
}
void enableinfraRed(void)
{
//enableTxInfra_dir = OUTPUT;//红外发送控制引脚为输出引脚;
enableTxInfra_LAT = 1;//0关闭红外发送,1为打开红外发送;
//enableRxInfra_dir = OUTPUT;//红外接收控制引脚为输出引脚;
enableRxInfra_LAT = 0;//1为关闭红外接收,0为打开红外接收;
}
//使能RS485通讯 发送
void enable485Send(void)
{
ch0enablesend = 1; //高电平可以发送
Nop();
Nop();
ch0enablerec_LAT = 1; //低电平不可以接收
}
void enable485Recv(void)
{
ch0enablesend = 0; //低电平不可以发送
Nop();
Nop();
ch0enablerec = 0; //低电平可以接收
}
void enablebuttomcomm(void)
{
enableTxMeter_LAT = 0;//1为关闭向内置电表发送数据,0为打开向内置电表发送数据;
Nop();
Nop();
enableRxMeter_LAT = 0;//1为关闭接收内置电表数据,0为打开接收内置电表数据;
}
void DMA0_init(void){
/****************************
DMA0中断初始化
****************************/
IFS0bits.DMA0IF = 0;//清零DMA0的中断标志;
IPC1bits.DMA0IP = 7;//设置DMA0的中断优先级为7;
IEC0bits.DMA0IE = 1;//打开DMA0中断服务;
/****************************
DMA0基本参数设置
****************************/
DMA0REQ = 0x001F;//强制DMA0传输(使能以后才可以置1,但无法清零),使用U2TX为DMA0的中断源;
//DMA0REQbits.FORCE = 1;
DMA0STA = (unsigned int)0x0000;//设置DMA0的主数据缓冲区的地址为0x4000,大小为1KB;
DMA0STB = (unsigned int)0x0400;//设置DMA0的辅数据缓冲区的地址为0x4400,大小为1KB;
DMA0PAD = (unsigned int)&U2TXREG;//设置与DMA通讯的外设缓存区的地址是寄存器U2TXREG的地址;
//DMA0CNT = 0x000f;//设置需要传输的数据的个数为2K个数据(字节或则是字);
/***************************************************************
设置DMA0模块为关闭状态,数据传输格式为字节格式,写入外设,
数据块传输完成中断模式,正常写模式,
寻址模式为带后递增模式,工作模式为连续数据块非乒乓模式;
***************************************************************/
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的中断标志;
DMA0CONbits.CHEN = 0;//关闭DMA0通道;
}
void DMA1_init(void){
/****************************
DMA1中断初始化
****************************/
IFS0bits.DMA1IF = 0;//清零DMA1的中断标志;
IPC3bits.DMA1IP = 7;//设置DMA1的中断优先级为7;
IEC0bits.DMA1IE = 1;//打开DMA1中断服务;
/****************************
DMA1基本参数设置
****************************/
DMA1REQ = 0x000c;//使用U1TX为DMA0的中断源;
DMA1STA = (unsigned int)0x0000;//设置DMA1的主数据缓冲区的地址为0x4000,大小为1KB;
DMA1STB = (unsigned int)0x0400;//设置DMA1的辅数据缓冲区的地址为0x4400,大小为1KB;
DMA1PAD = (unsigned int)&U1TXREG;//设置与DMA通讯的外设缓存区的地址是寄存器U1TXREG的地址;
/***************************************************************
设置DMA1模块为关闭状态,数据传输格式为字节格式,写入外设,
数据块传输完成中断模式,正常写模式,
寻址模式为带后递增模式,工作模式为连续数据块非乒乓模式;
***************************************************************/
DMA1CON = 0x6000;
}
void DMA1_start(unsigned int length){
DMA1CNT = length - 1;//设置传输数据块长度;
DMA1CONbits.CHEN = 1;//打开DMA1通道;
DMA1REQbits.FORCE = 1;//触发DMA1传输;
}
void _ISR _DMA1Interrupt(void){
IFS0bits.DMA1IF = 0;//清零DMA1的中断标志;
//DelayNmSec(2);
DMA1CONbits.CHEN = 0;//关闭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;
//中断标志状态寄存器0 :0--未产生中断请求;1--产生中断请求
IFS0bits.U1RXIF = 0;
IFS0bits.U1TXIF = 0;
//中断优先级控制寄存器2 :0~7 -- UART1接收优先级位数
IPC2bits.U1RXIP = 6;
//中断优先级控制寄存器3 :0~7 -- UART1发送优先级位数
IPC3bits.U1TXIP = 5;
/* enable/disable interrupt */
IEC0bits.U1RXIE = 1; //enable
IEC0bits.U1TXIE = 0; //disable
//波特率的设置
U1BRG = ((FCY/16)/baudrate) - 1;
//UART1模式寄存器
U1MODE = 0xC000; //使能UART1
//UART1状态控制寄存器
U1STA = 0x8550;
if(parity_check== PARITY_EVEN)
U1MODEbits.PDSEL=1;
else if(parity_check== PARITY_ODD)
U1MODEbits.PDSEL=2;
else
U1MODEbits.PDSEL=0x00;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -