硬件架构:
PC端用串口助手发送文件 -》M0516 接收串口数据-》 IO模拟I2C链接AT24C512
功能描述:
PC串口发送的BIN文件,M0接收到串口数据,将数据写到外扩的EEPROM,采用IO模拟的方式,写入的文件为64K大小。
目前思路:
串口设置为接收中断,接收满16byte(eeprom的一个page大小),在中断将该16byte转存给一个EEbuf,同步置一个标志位。
主循环检测到标志后,开始写一个page.
目前问题:
主频设置12M,波特率9600,串口接收的BIN文件小(不足1K)的时候,可以正常写入。串口数据大于1K的时候,数据会出错。
本人猜测,因为写入eeprom动作执行之后需要等待一段时间,这就导致写EEPROM的速度小于串口接收的速度,导致前面的数据被后面接收的数据覆盖,出现了写错误。但是降低了波特率到4800,问题依旧存在。
解决办法只想到了将主频倍频到50M,也没有其他好的办法,请高手指点。
附上关键代码:
串口接收中断部分:
char length = 128; //1page的大小
void UART0_IRQHandler(void)
{
char i ;
if(UA0_ISR & RDA_INT)//检查是否接收中断
{
RevBuf[RevIndex ++] = UA0_RBR;
if(RevIndex == length)
{
for(i = 0; i < length; i ++)
{
EeBuf = RevBuf; //转存一page数据
RevBuf = 0; //清空buf
}
RevIndex = 0;//指针归零
Rcv_flag = 1;//置位标志位
}
}
}
主循环部分:
while(1)
{
if(Rcv_flag)
{
EepromSequentialWrite(addr,EeBuf,length);// 写1 page
addr += length; //地址偏移量
Rcv_flag = 0; 清除标志位
//这里应该加适量的延时时间,保证写eeprom完成
}
}
,再说一下问题:接收的文件很小的时候可以写如eeprom,接收文件大的时候写入的数据是错的。 |