|
发表于 2012-8-22 13:20:59
|
显示全部楼层
mcu_mouse 发表于 2012-8-17 15:39
能否发上来看看
if(update_flag)
{
update_flag_RF = 0;
//打开epcs
my_epcs = alt_flash_open_dev("/dev/epcs_controller");
if(my_epcs)
{
ret_code = alt_epcs_flash_get_info(my_epcs, ®ions, &number_of_regions);
//IOWR(DIR_485_BASE,0,0x1);//485发送使能
Send2Ipc(0x00FD,0x0000); //回传准备好更新系统的命令
delay1(1000);
// IOWR(DIR_485_BASE,0,0x0);//485接收使能
IORD_ALTERA_AVALON_UART_RXDATA(UART_BASE);//清接收缓冲区
IOWR_ALTERA_AVALON_UART_STATUS(UART_BASE, 0);//清中断标志
IOWR_ALTERA_AVALON_UART_DIVISOR(UART_BASE, BRL115200);
check_error = 2;
//启动定时器5,计数等待
startUpdate_count = 0;
IOWR_ALTERA_AVALON_TIMER_CONTROL(TIMER5_BASE, 7);
while(1)
{
//当接收到第一个数包据后,开始更新,确保云台与机芯通讯正常
if(update_flag_RF == 1)
{
//关闭定时器
IOWR_ALTERA_AVALON_TIMER_CONTROL(TIMER5_BASE, 8);
//擦除8块
for(ii=0;ii<8;ii++)
{
alt_epcs_flash_erase_block(my_epcs, regions->offset+0x10000*ii);
}
//启动更新
startUpdate_flag = 1;
break;
}else
{
//如果等待8秒后仍旧收不到机芯发送的数据,退出更新程序
if(startUpdate_count == 8)
{
//关闭定时器
IOWR_ALTERA_AVALON_TIMER_CONTROL(TIMER5_BASE, 8);
startUpdate_count = 0;
//更新标志位置0,退出更新
update_flag = 0;
update_flag_RF = 0;
//不进行更新
startUpdate_flag = 0;
break;
}
}
}
while(startUpdate_flag == 1)
{
if(update_flag_RF==1)
{
update_flag_RF=0;
if (buffer_flag == 1)
{
update2_check = calcrc(&update2[1],256);
// update2_check=update2_check&0xFF;
if(update2_check == ((update2[257]<<8)| update2[258]))
{
update2_check = 0;
check_error = 0;
alt_epcs_flash_write_block(my_epcs, 0, regions->offset+0x100*buffer_dataNum, &update2[1], 256);
}else
{
check_error = 1;
}
}else if(buffer_flag == 2)
{
update1_check = calcrc(&update1[1],256);
// update1_check=update1_check&0xFF;
if(update1_check == ((update1[257]<<8)| update1[258]))
{
update1_check = 0;
check_error = 0;
alt_epcs_flash_write_block(my_epcs, 0, regions->offset+0x100*buffer_dataNum, &update1[1], 256);
}else
{
check_error = 1;
}
}
if(check_error == 0)
{
check_error = 2; //仅发送一次命令给主控板
buffer_dataNum++;
if(file_size == buffer_dataNum)//||((file_size - 1) == buffer_dataNum))
{
startUpdate_flag = 0;
Send_Check(0x00); //更新结束
IOWR(OUT_PIO_BASE,0,0xFF);
}
Send_Check(0x00); //ACK接收正确
}else if(check_error == 1)
{
check_error = 2; //仅发送一次,错误命令
Send_Check(0x15); //错误
}
}
}
alt_flash_close_dev(my_epcs);
}
else
{
update_flag = 0;
}
}
这是串口更新部分的源代码,NIOSII实现的,如果FPGA资源够的话,与其做单片机的板子,还不如用NIOS核。希望对大家有帮助 |
|