ULM300BOX项目

2017-02-23  本文已影响36人  Ben2Feng

导语:此主题为ULM300系列项目开发中遇到的一些问题以及它们的解决方式。

一,IA2E芯片无法直接输出RSSI信号强度信息

  • IA2E芯片是一款2.4G频段的无线音频芯片,属于10年前的产品,芯片原厂的技术支持较弱,芯片文档简单;

解决思路

在上一代产品USB300中发现,若发送端(TX)改变了音量大小,则TX会发送一个代表音量大小的值(比如0xd7)到接收端(RX),这个值只会在音量大小有改变的时候发送一次。

#define BER_FULL_VALUE      168//在一个周期里总共可以接收168个数据
#define BER_COUNT_CYCLE     108     /*set  the PER count cycle 1080ms*/
void RSSI_Process(uint8_t PER_CODE){
    if((PER_CODE==0xee)||(PER_CODE==0xf1)||(PER_CODE==0xf4)||(PER_CODE==0x0f7)\
        ||(PER_CODE==0xfa)||(PER_CODE==0xfd)||(PER_CODE==0x00)){
        ANT_RSSI.ber_count++;
        if(ANT_RSSI.ber_count_time>=BER_COUNT_CYCLE){/*set  the BER count cycle 1080ms*/
            ANT_RSSI.ber_count_time=0;
            ANT_RSSI.BER=((ANT_RSSI.ber_count*100)/BER_FULL_VALUE);
            if(ANT_RSSI.BER>=80){
                Led.RSSI=RSSI_Good;
            }
            if((ANT_RSSI.BER>=70)&&(ANT_RSSI.BER<80)){
                Led.RSSI=RSSI_soso;
            }
            if((ANT_RSSI.BER>=60)&&(ANT_RSSI.BER<70)){
                Led.RSSI=RSSI_low;
            }
            if(ANT_RSSI.BER<60){
                Led.RSSI=RSSI_bad;
                ANT_RSSI.count++;
                if(ANT_RSSI.count==4){//连续5S信号差就切换天线
                    ANT_RSSI.count=0;
                    ANT_Switch();           /*switch the ant*/
                }
            }
            ANT_RSSI.ber_count=0;
        }
    }
}
信号good
信号soso
无信号

二、更改后的软件无MUTE功能

发送端TX长按Down键达3秒以上,接收端RX(只有RX端有第三方MCU)收到后不播放声音来实现MUTE功能。

解决过程

此为纯软件BUG,经过调试软件发现产生此问题的两个原因。

1、IA2E芯片的运行程序存储背景

uint8_t EEPROM_TxByte() {
    
    uint8_t tx;
    
    if( byte_addr >= sizeof( IA2E_ROM ) ) {
        IA2E_Boot_Complete = SET;
    }
    
    if( byte_addr == IA2E_LATENCY_ADDR ) {
        byte_addr++;
        tx = IA2E_LATENCY_VAL;
    } else if( ( byte_addr >= IA2E_ID_ADDR ) &&
        ( byte_addr < ( IA2E_ID_ADDR + IA2E_ID_SIZE ) ) ) {//三个字节存放MCU的ID号
        tx = UID >> ( ( byte_addr++ - IA2E_ID_ADDR ) << 3 );//写固定的MCU的ID号,只写6位
    } else {
        tx = *( IA2E_ROM + byte_addr++ );
    }
    return tx;
    
}

2、无MUTE功能产生的原因

void EEPROM_RxByte( uint8_t rx ) {
    
    switch( byte_cnt++ ) {
        case 0:
            ( ( uint8_t *)&byte_addr )[1] = rx;     // store MSB
            break;
        case 1:
            ( ( uint8_t *)&byte_addr )[0] = rx;     // store LSB
            break;
        default:
//          IA2E_ROM[ ( byte_addr++ - 2 ) & 0x1FFF ] = rx;
            switch( byte_addr++ ) {
//              case SYNIC_EEPROM_PER_ADDR:
//                  RSSI_Process( rx );
//                  break;
                case SYNIC_EEPROM_STATUS_ADDR:
//                  SYNIC_STATUS=rx;
                    SYNIC_SetStatus( rx );
                    break;
                case SYNIC_EEPROM_VOLUME_ADDR:
                    if(rx==0x06)//衣领夹麦克峰固定发射06值过来表示最大值
                        rx=0x00;//00表示音量最大值
                    if(SYNIC_Volume_Mute==0)
                    {
                        SYNIC_SetVolume( rx );
                    }
                    RSSI_Process( rx );
                    break;
            }
            break;
    }
    
}
  • TX端会不断的发送volume值(假设volume=0xD7)到RX,意味着无论TX端有无按键变化都会隔一小段时间(6.4ms)发送volume值给RX,RX端会周期性的执行case SYNIC_EEPROM_VOLUME_ADDR:程序实现声音;
  • 假设某一时刻t=6.4ms内,有一个MUTE值过来(假设此时volume=0xD7,声音正常大小),这时RX端执行case SYNIC_EEPROM_STATUS_ADDR:程序实现了MUTE功能,在过t=6.4ms后,TX又发送volume=0xD7数据到RX,之后RX端执行程序case SYNIC_EEPROM_VOLUME_ADDR:实现声音正常大小,这样MUTE的效果就听不出来了。

3、解决的方法

case SYNIC_EEPROM_VOLUME_ADDR:程序内执行函数SYNIC_SetVolume( rx )前添加条件if(SYNIC_Volume_Mute==0),表示只有在无MUTE情况下,才会执行SYNIC_SetVolume( rx )函数,这样在MUTE状态不解除的情况下即使有volume值发送到RX端也不会影响MUTE功能。

上一篇 下一篇

猜你喜欢

热点阅读