阿莫论坛的大虾门,指点一下啦
本帖最后由 dhw5qq 于 2014-6-25 09:11 编辑我昨天也发了帖子的,但是没人理我,很尴尬。
就是说硬件iic中断时间如何减少,BMS系统要求接收命令和发数据合起来在1ms内完成。
我用论坛有个前辈的程序,测试有80ms左右的样子,现在是如何去吧这个时间减少到最小!
贴部分程序
主机:
write_gasgauge(0x07);
delay_ms(25);
iic_buf=read_gasgauge();
delay_ms(5);
write_gasgauge(0x08);
delay_ms(25);
iic_buf=read_gasgauge();
delay_ms(25);
current=(iic_buf<<8)|iic_buf; //电流
从机:
//中断处理机制,iic产生寻址中断,在接受地址后产生握手,然后收到主机发的命令,然后把数据发给主机!
#pragma interrupt_handler iic_irq:25
voidiic_irq(void)
{
CLI();
// ms=0;
switch(STATUS) //状态采集
{
case SR_SLA_ACK: //从机地址写完成
flag=1;
//ms=0;
case SR_ARB_LOST_SLA_ACK: //仲裁失败
case SR_GC_ACK: //收到主机广播并且ack返回
ACK(); //接受到地址并且ack返回给主机
break;
case SR_SLA_DATA_ACK: //接受到数据并且ack返回
case SR_GC_DATA_ACK: //广播形式接受到数据
temp1=TWDR; //产生general call地址匹配
ACK(); //接受到地址并且ack返回给主机
break;
case SR_SLA_DATA_NACK:
case SR_GC_DATA_NACK: //不读取主机数据就发nack
NACK(); //发送nack给主机 ;
break;
case SR_STOP_REST:
ACK();
break;
case ST_SLA_ACK: // 0xA8: 自己的SLA+R 已经被接收,ACK 已返回
//flag=1;
case ST_ARB_LOST_SLA_ACK: // 0xB0: SLA+R/W 作为主机的仲裁失败;自己的SLA+R 已经被接收,ACK 已返回
switch(temp1)
{
case 0x07:
TWDR=(u8)((current&0xff00)>>8);
ACK();
break;
case 0x08:
//flag=1;
TWDR=(u8)(current&0x00ff);
ACK();
break;
default:break;
}
break;
case ST_DATA_ACK: // 0xB8: TWDR 里数据已经发送,接收到ACK
break;
case ST_DATA_NACK: // 0xC0: TWDR 里数据已经发送接收到NOT ACK
NACK();
case ST_LAST_DATA: // 0xC8: TWDR 的一字节数据已经发送(TWAE = “0”);接收到ACK
NACK();
twi_init(); //重新回到初始化状态,等待接收模式的到来
break;
case NO_INFO: // 0xF8: 没有相关的状态信息;TWINT = “0”
break;
case BUS_ERROR: // 0x00: 由于非法的START 或STOP 引起的总线错误
TWCR=(TWCR&TWCR_CMD_MASK)|(1<<TWINT)|(1<<TWSTO)|(1<<TWEA);
default:break;
}
SEI();
}
这是我用逻辑分析仪抓的波形,
中间的时间是100ms,可能就是中断执行的时间,所以对于硬件iic的话,必须吧这段时间减少,还有,就是说我不明白,为什么我主机发命令都没有ff,可是读取的数据却又ff,好奇怪,难道说iic中断里面没有吧数据发出来,还是说有其他某种原因,一直没有弄明白,希望阿莫高手给我指点迷津!
困惑了很久!实验也做了不少,还是 没有进展,这个BMS系统难道真的要换方案了?
楼主标题不合格,要修改~~~ 你中断里面没有很耗时的程序,不可能减少MS级别的时间的 光几个delay已经80ms,要1ms完成,你是在讲笑话吗 zhanglei1986145 发表于 2014-6-25 09:28
你中断里面没有很耗时的程序,不可能减少MS级别的时间的
那最快是多少,还有我的硬件接收和发送,其实也是按照主机的时钟频率来的,对不对?
god-father 发表于 2014-6-25 09:37
光几个delay已经80ms,要1ms完成,你是在讲笑话吗
那时间都到哪去了,不可能在中断就需要那么长时间吧? 再贴个我主机发数据和读数据的协议,
void write_gasgauge(u8 cmd)
{
I2C_start();
I2C_write(0xaa);
delay_us1(1);
I2C_write(cmd);
I2C_stop();
}
u8 read_gasgauge(void)
{
u8 temp=0,temp1=0;
I2C_start();
I2C_write(0xab);
// delay_us1(1);
//temp1=I2C_read(1);
// temp=I2C_read(1);
temp=I2C_read(0);
I2C_stop();
returntemp;
} 现在不知道哦啊在哪里可以减少时间的开销,无比蛋疼,调试了快半个月了,一点进展都没有,老板都发飙了,昨天还在催着呢! 刚才把时间都调短了,发现有进展了,但是还是100ms左右的样子,1s才读取10次,要是电流的话,那么很有可能你硬件硬件保护 了,你才读取到这个电流数据,完全不可以啊! BMS是什么? 蓄电池管理系统吗? 樓主,你提問的方法不對。
提問,衹是希望知道你原本不知道,或想不明白的東西。指望被提問者幫你解決問題,是不可能的。
如果被提問者無辦法在眼睛一掃之下,看明白你的問題,知道你確切想問些甚麼,那麼他很可能不會回答你。
比如這張帖,開頭有四行。
我昨天也发了帖子的,但是没人理我,很尴尬。
就是说硬件iic中断时间如何减少,BMS系统要求接收命令和发数据合起来在1ms内完成。
我用论坛有个前辈的程序,测试有80ms左右的样子,现在是如何去吧这个时间减少到最小!
贴部分程序
第一行完全是廢話。而且被提問者知道你有“前科”的話, 他們的反感程度就更高了。
第二行和第三行,可以歸納爲“如何減少硬件IIC中斷時間”。至於你要求多少毫秒,而今又是多少毫秒,可以放到後面纔詳細描述。
注意!千萬不要有拼寫錯誤!比如你將“IIC”,寫成“iic”,被提問者可能會認爲你是個懶人,連按一下Caps Lock也不肯,想必是個不嚴謹的人。
再注意!千萬不要說你“用了誰誰誰的東西”。如果是個名人,那還好說;倘若被提問者不認識他,那麼他會想“你用他的代碼,關我屌事?有問題直接去找他啊!”然後關掉瀏覽器窗口。
說清楚每一箇細節!
比如,你是怎麼做的?這箇硬件IIC,你是怎麼操控的?貼出這部份代碼,而不是整段代碼。必要時,你應該貼出僞代碼,簡要說明你進行了甚麼操作。
BMS是甚麼?11樓的朋友liyfmc表示不認識。如果你確定BMS和你的問題有莫大關聯,那麼你纔可以加上去。否則,你應該通俗地說“我的硬件IIC和外圍標準設備通訊……”。
你做了些甚麼實驗?你觀察到甚麼現象?
有沒有用示波器,觀察過IIC通訊過程中,沒箇階段的用時各是多少?
如果你觀察過,覺得初始化部份太長,你就可以在問題裏詳細說“初始化部份用了35ms”,然後在問題最後提出你合理的猜測“這箇時間會不會是不正常的?”,以幫助被提問者narrow down。 目前从机读取数据还是比较快的,3ms读取完一个电流数据,
关键是中断那里,怎么提高速度呢? 谢谢12楼盆友的提醒,也许是我急于求成了,没吧话给说明白。
好,我就仔细的描述下:
我这个BMS系统是用在锂电池管理上面的,实现的功能大致上有检测电流,温度,电压,容量的检测,目前我正在做电流检测,必须在2ms之内读取到电流,而且根据电流做出过流反应。
再说下,我的这个系统大致框架,一个mg48和BQ3050绑定在一起,然后mg16作为主机和mg48的硬件iic接口做通讯。目前我测试是电流,2个字节,所以我就按照主机发一个命令,接收一个字节的方法,代码我贴出来了。
现在问题是mg16要在2ms以内读取出电流数据,我用逻辑分析仪抓了波形,发现中断耗时100ms左右哦,我实在是想不通,为什么中断里面要执行这么长时间,所以恳请了解硬件iic接口的朋友给看一下,因为我这个到时候可能是要做大系统的,比如我mg48要接10个BQ3050呢,那么所有的锂电池的数据如何在最短的时间内发送给主机,然后主机做出相对应的判断! dhw5qq 发表于 2014-6-25 11:48
谢谢12楼盆友的提醒,也许是我急于求成了,没吧话给说明白。
好,我就仔细的描述下:
我这个BMS系统是用在 ...
i2c总线支持的速率很高(高到你不需要),重点检查你I2C的时序(或许不需要这么长的delay),从机状态可以下载8563之类的手册比较一下。 中断的时间太长了吧
页:
[1]