dhw5qq 发表于 2014-6-25 09:08:33

阿莫论坛的大虾门,指点一下啦

本帖最后由 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();
}

dhw5qq 发表于 2014-6-25 09:15:17

这是我用逻辑分析仪抓的波形,
中间的时间是100ms,可能就是中断执行的时间,所以对于硬件iic的话,必须吧这段时间减少,还有,就是说我不明白,为什么我主机发命令都没有ff,可是读取的数据却又ff,好奇怪,难道说iic中断里面没有吧数据发出来,还是说有其他某种原因,一直没有弄明白,希望阿莫高手给我指点迷津!
困惑了很久!实验也做了不少,还是 没有进展,这个BMS系统难道真的要换方案了?

tianming 发表于 2014-6-25 09:18:25

楼主标题不合格,要修改~~~

zhanglei1986145 发表于 2014-6-25 09:28:56

你中断里面没有很耗时的程序,不可能减少MS级别的时间的

god-father 发表于 2014-6-25 09:37:30

光几个delay已经80ms,要1ms完成,你是在讲笑话吗

dhw5qq 发表于 2014-6-25 10:27:28

zhanglei1986145 发表于 2014-6-25 09:28
你中断里面没有很耗时的程序,不可能减少MS级别的时间的

那最快是多少,还有我的硬件接收和发送,其实也是按照主机的时钟频率来的,对不对?

dhw5qq 发表于 2014-6-25 10:31:24

god-father 发表于 2014-6-25 09:37
光几个delay已经80ms,要1ms完成,你是在讲笑话吗

那时间都到哪去了,不可能在中断就需要那么长时间吧?

dhw5qq 发表于 2014-6-25 10:39:59

再贴个我主机发数据和读数据的协议,
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;
}

dhw5qq 发表于 2014-6-25 10:41:10

现在不知道哦啊在哪里可以减少时间的开销,无比蛋疼,调试了快半个月了,一点进展都没有,老板都发飙了,昨天还在催着呢!

dhw5qq 发表于 2014-6-25 10:52:12

刚才把时间都调短了,发现有进展了,但是还是100ms左右的样子,1s才读取10次,要是电流的话,那么很有可能你硬件硬件保护 了,你才读取到这个电流数据,完全不可以啊!

liyfmc 发表于 2014-6-25 11:12:10

BMS是什么?   蓄电池管理系统吗?

qlb1234 发表于 2014-6-25 11:40:00

樓主,你提問的方法不對。

提問,衹是希望知道你原本不知道,或想不明白的東西。指望被提問者幫你解決問題,是不可能的。

如果被提問者無辦法在眼睛一掃之下,看明白你的問題,知道你確切想問些甚麼,那麼他很可能不會回答你。
比如這張帖,開頭有四行。
我昨天也发了帖子的,但是没人理我,很尴尬。
就是说硬件iic中断时间如何减少,BMS系统要求接收命令和发数据合起来在1ms内完成。
我用论坛有个前辈的程序,测试有80ms左右的样子,现在是如何去吧这个时间减少到最小!
贴部分程序
第一行完全是廢話。而且被提問者知道你有“前科”的話, 他們的反感程度就更高了。
第二行和第三行,可以歸納爲“如何減少硬件IIC中斷時間”。至於你要求多少毫秒,而今又是多少毫秒,可以放到後面纔詳細描述。
注意!千萬不要有拼寫錯誤!比如你將“IIC”,寫成“iic”,被提問者可能會認爲你是個懶人,連按一下Caps Lock也不肯,想必是個不嚴謹的人。
再注意!千萬不要說你“用了誰誰誰的東西”。如果是個名人,那還好說;倘若被提問者不認識他,那麼他會想“你用他的代碼,關我屌事?有問題直接去找他啊!”然後關掉瀏覽器窗口。

說清楚每一箇細節!
比如,你是怎麼做的?這箇硬件IIC,你是怎麼操控的?貼出這部份代碼,而不是整段代碼。必要時,你應該貼出僞代碼,簡要說明你進行了甚麼操作。
BMS是甚麼?11樓的朋友liyfmc表示不認識。如果你確定BMS和你的問題有莫大關聯,那麼你纔可以加上去。否則,你應該通俗地說“我的硬件IIC和外圍標準設備通訊……”。

你做了些甚麼實驗?你觀察到甚麼現象?
有沒有用示波器,觀察過IIC通訊過程中,沒箇階段的用時各是多少?
如果你觀察過,覺得初始化部份太長,你就可以在問題裏詳細說“初始化部份用了35ms”,然後在問題最後提出你合理的猜測“這箇時間會不會是不正常的?”,以幫助被提問者narrow down。

dhw5qq 发表于 2014-6-25 11:40:17

目前从机读取数据还是比较快的,3ms读取完一个电流数据,

关键是中断那里,怎么提高速度呢?

dhw5qq 发表于 2014-6-25 11:48:17

谢谢12楼盆友的提醒,也许是我急于求成了,没吧话给说明白。
好,我就仔细的描述下:
我这个BMS系统是用在锂电池管理上面的,实现的功能大致上有检测电流,温度,电压,容量的检测,目前我正在做电流检测,必须在2ms之内读取到电流,而且根据电流做出过流反应。

再说下,我的这个系统大致框架,一个mg48和BQ3050绑定在一起,然后mg16作为主机和mg48的硬件iic接口做通讯。目前我测试是电流,2个字节,所以我就按照主机发一个命令,接收一个字节的方法,代码我贴出来了。
现在问题是mg16要在2ms以内读取出电流数据,我用逻辑分析仪抓了波形,发现中断耗时100ms左右哦,我实在是想不通,为什么中断里面要执行这么长时间,所以恳请了解硬件iic接口的朋友给看一下,因为我这个到时候可能是要做大系统的,比如我mg48要接10个BQ3050呢,那么所有的锂电池的数据如何在最短的时间内发送给主机,然后主机做出相对应的判断!

god-father 发表于 2014-6-25 12:45:55

dhw5qq 发表于 2014-6-25 11:48
谢谢12楼盆友的提醒,也许是我急于求成了,没吧话给说明白。
好,我就仔细的描述下:
我这个BMS系统是用在 ...

i2c总线支持的速率很高(高到你不需要),重点检查你I2C的时序(或许不需要这么长的delay),从机状态可以下载8563之类的手册比较一下。

rockyyangyang 发表于 2014-6-29 11:04:55

中断的时间太长了吧               
页: [1]
查看完整版本: 阿莫论坛的大虾门,指点一下啦