ULM300BOX项目

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

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

  • IA2E芯片是一款2.4G频段的无线音频芯片,属于10年前的产品,芯片原厂的技术支持较弱,芯片文档简单;
  • 该芯片推荐电路方案中,开发的源代码是汇编由供应商提供,外围电路指示信号强度的4个灯,若要用该芯片直接接灯并修改底层程序来实现指示信号强度的功能则困难较大;
  • 公司前期产品USB300里通过加第三方MCU接收IA2E的音频数据流实现了USB可插拔播放音乐的功能和一些其它的IA2E无法实现的功能,由此若IA2E芯片能够在工作时把其RSSI数据传输给第三方MCU、由MCU控制指示灯来显示产品工作时的信号强度则可达到所开发产品的功能设计目的。

解决思路

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

  • 人为模拟RSSI信号发送过程
    人为假定一个信号发送周期T(实际测试周期T=1080ms)、TX端在这个周期T内重复发送音量大小值(比如0xd7)、据统计大概发送了Ntx=168个、每个间隔6.4ms左右,然后在RX端统计接收到的该音量值的个数(比如Nrx=80个),那么误码率BER=Ntx/Nrx=50%,根据不同的BER值来显示满格、两格或者一格信号强度,具体代码如下。
#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;
        }
    }
}
  • 数据包传输给MCU
    IA2E接收到音量值数据包package后通过I2C传输给MCU,MCU获得package后处理数据来控制四个LED灯指示信号强度。共5种信号强度等级:good(亮4个绿灯)、soso(亮3个绿灯)、low(亮2个绿灯)、bad(亮1个绿灯)、none(亮1个红灯)相关效果如下图。
信号good

信号soso

无信号

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

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

解决过程

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

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

  • IA2E芯片的代码是BIN文件(BACHRX_inno_per_vol.bin),由供应商提供;此BIN文件数据作为一个数组const uint8_t IA2E_ROM[/*6144*/]合成在MCU程序中。

  • 编译MCU软件后,数组const uint8_t IA2E_ROM[/*6144*/]成为MCU软件的一部分放置于FLASH中,具体在哪个位置由编译器决定,但可以肯定的是数组const uint8_t IA2E_ROM[/*6144*/]名代表IA2E软件存储的首地址。

  • RX端MCU发送bin文件给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;
    }
    
}
  • 函数Stream_SetLevel( volume )实现音量大小的改变,程序case SYNIC_EEPROM_STATUS_ADDR:和程序case SYNIC_EEPROM_VOLUME_ADDR:都会调用Stream_SetLevel( volume )函数;
  • RX端中IA2E芯片音量状态值放置在地址#define SYNIC_EEPROM_STATUS_ADDR 0x17DD上,音量值放置在地址#define SYNIC_EEPROM_VOLUME_ADDR 0x17F0上,MUTE属于音量状态数据;
  • 无论status值还是volume值,只有有按键变化TX端才会发送值到RX端且一次只可能发送其中的一种,如此在按了MUTE键后,RX端只会执行case SYNIC_EEPROM_STATUS_ADDR:中的程序实现MUTE功能;
  • 若后续TX端无按键变化,则RX端的IA2E芯片不会通过I2C发送音量值到RX中的MCU中,这样MCU也就不会执行switch( byte_addr++ )里面的程序,如此RX端音量状态和音量大小将保持前一状态;
  • 由于要模拟RSSI功能,产生了以下现象:
  • 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功能。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,240评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,328评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,182评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,121评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,135评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,093评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,013评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,854评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,295评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,513评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,398评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,989评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,636评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,657评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容