This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] LP5523:无法在两个不同的 RGB 上并行运行两个闪烁模式

Guru**** 2511095 points
Other Parts Discussed in Thread: LP5523

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/911055/lp5523-cannot-run-two-blink-pattern-on-two-different-rgb-in-parallel

器件型号:LP5523

您好!

我正在开发 LP5523的驱动程序、以便管理2个 RGB LED (我们称之为 B 和 C)和1个单独的 LED (让我们称之为 A)。

我开发了闪烁/呼吸等 使用指令集的图形。

LED A 分配给发动机1、其 PROG START ADDR 为0x00。

LED B 分配给发动机2、其 PROG START ADDR 为0x20。

LED C 分配给发动机3、其 PROG START ADDR 为0x40。

这个结构允许我在每个 LED 上单独运行一个不同的代码。 由于我使用相同的功能来管理所有 LED、因此 PC 和其他寄存器均已正确设置、只需使用一个参数来说明所关注的 LED。 在单个 LED 或 RGB LED 上尝试这些功能时、一切都正常。

初始化使用以下值:

  • 寄存器0x00取值0x40
  • 寄存器0x36采用值0x5B
  • 寄存器0x06-0x0E 采用值0x20

我的问题是、我可以在发动机1和2、发动机1和3上运行平行模式、但不能在发动机2和3上运行。

当我在发动机3和发动机2 (或相反)上启动闪烁模式(例如)时、连接到发动机2的 LED 闪烁几次、然后斜升并保持亮起... 我还想、从这一点开始、LP5523变得有点"疯狂"、有时会打开/关闭一些 LED。

有什么想法吗?

谢谢。

约克

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、 Yorick、

    您能帮您分享您的引擎代码吗?  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    代码很长、但我将尝试分享必要的内容。

    寄存器定义:

    #define LP5523_ADDR0 0x32
    
    #define LP5523_REG_ENGCTRL1 0x00
    #define LP5523_REG_ENGCTRL2 0x01
    #define LP5523_REG_OUTCTRL_LSB 0x05
    #define LP5523_REG_D1CTRL 0x06
    #define LP5523_REG_D2CTRL 0x07
    #define LP5523_REG_D3CTRL 0x08
    #define LP5523_REG_D4CTRL 0x09
    #define LP5523_REG_D5CTRL 0x0A
    #define LP5523_REG_D6CTRL 0x0B
    #define LP5523_REG_D7CTRL 0x0C
    #define LP5523_REG_D8CTRL 0x0D
    #define LP5523_REG_D9CTRL 0x0E
    #define LP5523_REG_D1PWM 0x16
    #define LP5523_REG_D2PWM 0x17
    #define LP5523_REG_D3PWM 0x18
    #define LP5523_REG_D4PWM 0x19
    #define LP5523_REG_D5PWM 0x1A
    #define LP5523_REG_D6PWM 0x1b
    #define LP5523_REG_D7PWM 0x1C
    #define LP5523_REG_D8PWM 0x1D
    #define LP5523_REG_D98PWM 0x1E
    #define LP5523_REG_MISC 0x36
    #define LP5523_REG_STATUS 0x3A
    #define LP5523_REG_RESET 0x3D
    #define LP5523_REG_ENG1PROGSTARTADR 0x4C
    #define LP5523_REG_ENG2PROGSTARTADR 0x4D
    #define LP5523_REG_ENG3PROGSTARTADR 0x4E
    #define LP5523_REG_PROGMEMPAGE 0x4F
    #define LP5523_REG_PROGMEM 0x50
    
    typedef 枚举
    {
    LP5523_ENGINE_1 = 1、
    LP5523_ENGINE_2、
    LP5523_ENGINE_3、
    LP5523_ENGINE_NBR_FLOCINTS= 3、
    }LP5523_ENGINE;
    
    #define LP5523_VAR_A 0
    #define LP5523_VAR_B 1
    #define LP5523_VAR_C 2
    #define LP5523_VAR_D 3
    
    #define LP5523_LOOP_INF 0
    
    #define LP5523_PWM_0 0x00
    #define LP5523_PWM_100 0xFF
    
    #define LP5523_OP_SET_PWM (v) (0x4000|v)//设置 PWM
    #define LP5523_OP_WAIT_100ms (0x4700)//等待、109ms
    #define LP5523_OP_WAIT_200ms (0x4D00)//等待、203ms
    #define LP5523_OP_WAIT_240MS (0x4F00)//等待、234ms
    #define LP5523_OP_WAIT_400ms (0x5A00)//等待、406ms
    #define LP5523_OP_WAIT_480MS (0x5F00)//等待、484ms
    #define LP5523_OP_END (IT、rst) (0xC000|(IT<<12)|(rst<11))//结束
    #define LP5523_OP_BRANCH (STP、cnt) (0xA000|((cnt 和0x3F)<<7|(STP&0x7F))//分支
    #define LP5523_OP_BRANCHA (STP、var) (0x8600|((STP&0x7F)<<2)|(var&0x03)//分支变量 a
    #define LP5523_OP_LOAD (var、val) (0x9000|((var&0x03)<<10)|(val&0xFF))//加载
    #define LP5523_OP_RAMPUP_Q (Tim、inc) (0x0000|((Tim&0x1F)<<9)|(inc&0xFF))//快速斜升,增量步长为0.488ms
    #define LP5523_OP_RAMPUP_S (Tim、inc) (0x4000|((TIM&0x1F)<<9)|(INC&0xFF)//斜升慢,增量步骤15.625ms
    #define LP5523_OP_rampdown_Q (TIM&0x1F)(TIM&0x01F|(TIM&0x4100)<<9)|(INC&0x625 ms)//斜升(TIM5523_INC
    )#define RAM1M23_RAM1|(TIM1M&INC#ram_RAM1M1F)(#define 0x488_RAM1M1&INC#define)(TIM1M1M1M1&INC#RM_RAP= 0x001F)/TIM1M1M1M1M1M1M1M1&
    (0x9D00)//多路复用器清除
    #define LP5523_OP_MUX_SEL (LED) (0x9D00|LED)//多路复用器选择
    #define LP5523_OP_MUX_MAPADDR (addr) (0x9F80|addr)//多路复用器映射地址
    #define LP5523_OP_END (IT、rst) (0xC000|(IT<<12)|(rst<11)
    )#define LP5523_OP_NOOP (0x0000)
    
    #define LP5523_VAL_RESET 0xFF
    #define LP5523_VAL_ENGCTRL1_CE 0x40
    #define LP5523_VAL_MISC 0x5B
    #define LP5523_VAL_OUTCTRL_OUTON_D5 0x10
    #define LP5523_VAL_DxCTRL_LOGADJON 0x20
    
    #define LP5523_VAL_ENGCTRL1_ENG_MASK (I) (0x03<<((LP5523_ENGIN_3-I)<<1)
    )#define LP5523_VAL_ENGCTRL1_ENG_HOLD (I) (0x00<<((LP5523_ENGIN_3-I)<1)
    #define LP5523_VAL_ENGCTRL1_ENG_RUN (I) (0x02<<((LP5523_ENGIN_3-I)<<1)
    
    #define LP5523_VAL_ENGCTRL2_ENG_MASK (I) (0x03<<((LP5523_ENGING_3-I)<<1)
    #define LP5523_VAL_ENGCTRL2_ENG_DISABLE (I)(0x00<<((LP5523_ENGING_3-I)<1)
    #define LP5523_VAL_ENGCTRL2_ENG_LOAD (I) (0x01<<((LP5523_ENGIN_3-I)<<1)
    #define LP5523_VAL_ENGCTRL2_ENG_RUN (I) (0x02<<((LP5523_ENGIN_3-I)<<1)
    #define LP5523_VAL_ENGCTRL2_ENG_HALT (I) (0x03<<((LP5523_ENGINEBUSY)<<1)
    
    )#define LP5523_VAL_STATUS_ENGINEBUSY 0x10
    #define LP5523_VAL_STATUS_ENG1_INT 0x04
    #define LP5523_VAL_STATUS_ENG2_INT 0x02
    #define LP5523_VAL_STATUS_Eng3_INT 0x01 

    闪烁程序:

    #define LED_PROG_ADDR_SIZE 1
    #define LED_PROG_CODE_SIZE 26 //每条指令使用2个字节
    #define LED_PROG_SIZE (LED_PROG_ADDR_SIZE + LED_PROG_CODE_SIZE)
    
    #define LED_ADD_OP (ar、i、op) ar[i++]=(uint8_t)(op >> 8);\
    ar[i++]=(uint8_t)(op)
    
    uint8_t u8ProgSelEngineAndAddr (LP5523_engine eEng)
    {
    uint8_t u8Addr = 0;
    开关(eEng)
    {
    LP5523_ENGINE_1案例:
    au8EngProgVal4a[1]= 0;//页面选择
    au8EngProgVal4c[0]= LP5523_REG_ENG1PROGSTARTADR;
    au8EngProgVal4c[1]= 0x00;
    u8Addr = 0x00;
    中断;
    LP5523_ENGINE_2案例:
    au8EngProgVal4a[1]= 2;//页面选择
    au8EngProgVal4c[0]= LP5523_REG_ENG2PROGSTARTADR;
    au8EngProgVal4c[1]= 0x20;
    u8Addr = 0x20;
    中断;
    LP5523_ENGINE_3案例:
    au8EngProgVal4a[1]= 4;//页面选择
    au8EngProgVal4c[0]= LP5523_REG_ENG3PROGSTARTADR;
    au8EngProgVal4c[1]= 0x40;
    u8Addr = 0x40;
    中断;
    默认值:
    中断;
    }
    返回 u8Addr;
    }
    
    void vProgBlink (LP5523_engine eEng、uint16_t u16LedMap、LED_LED eLED、uint16_t u16LedAll)
    {
    uint8_t u8Idx = LED_PROG_ADDR_SIZE;
    uint8_t u8Start = u8ProgEngineSelAndAddr (eEng);
    
    LED_ADD_OP (au8EngProgVal4b、u8Idx、LP5523_OP_MUX_MAPADDR ((u8Start+12))); // op 1/13
    LED_ADD_OP (au8EngProgVal4b、u8Idx、LP5523_OP_SET_PWM (0x00)); // op 2/13
    LED_ADD_OP (au8EngProgVal4b、u8Idx、LP5523_OP_MUX_MAPADDR ((u8Start+11))); // op 3/10
    LED_ADD_OP (au8EngProgVal4b、u8Idx、LP5523_OP_SET_PWM (0xFF)); // op 4/10
    LED_ADD_OP (au8EngProgVal4b、u8Idx、LP5523_OP_WAIT_480MS); // op 5/10
    LED_ADD_OP (au8EngProgVal4b、u8Idx、LP5523_OP_SET_PWM (0x00)); // op 6/10
    LED_ADD_OP (au8EngProgVal4b、u8Idx、LP5523_OP_WAIT_480MS); // op 7/10
    LED_ADD_OP (au8EngProgVal4b、u8Idx、LP5523_OP_branch ((u8Start+3)、LP5523_LOOP_INF));// op 8/10
    LED_ADD_OP (au8EngProgVal4b、u8Idx、LP5523_OP_NOOP); //操作9/10
    LED_ADD_OP (au8EngProgVal4b、u8Idx、LP5523_OP_NOOP); // op 10/10
    LED_ADD_OP (au8EngProgVal4b、u8Idx、LP5523_OP_NOOP); //操作11/10
    LED_ADD_OP (au8EngProgVal4b、u8Idx、u16LedMap); //操作12/10
    LED_ADD_OP (au8EngProgVal4b、u8Idx、u16LedAll); // op 13/13
    
    TWI_vExec (&tTrnsEngProg1);
    } 

    最后是事务。 我使用"nrfx manager"来管理 I2C 通信。

    #define LED_REG_READ (p_buffer) NRF_TWI_mngr_write (LP5523_ADDR0、p_buffer、1、NRF_TWI_mngr_no_stop)、NRF_TWI_mngr_read (LP5523_ADDR0、 p_buffer+1、sizeof (p_buffer)-1、0)
    
    #define LED_REG_WRITE (p_buffer) nrf_tWI_mngr_write (LP5523_ADDR0、p_buffer、sizeof (p_buffer)、0)
    
    #define LED_transaction (name、transf、 瞬态)\
    static nrf_twi_mngr_transaction_t name ={\
    回调 = vTransactionCallback、\
    .p_user_data =(void*)(transid << 24)、\
    .p_transfers = transf、\
    .number_of_transfers = sizeof (transf)/ sizeof (transf[0])\
    }
    
    
    //**@程序引擎的简要寄存器'值
    *
    读取状态
    */
    静态 uint8_t au8EngProgVal1[2]=
    {
    LP5523_REG_STATUS
    、};
    静态 nrf_twi_mngr_transfer_t atTrsfrEngProg1[]={
    LED_REG_READ (au8EngProgVal1)、
    };
    LED_TRANSACTION (tTrnsEngProg1、atTrsfrEngProg1、LED_TRANSID_ENGINE_PROG1);
    
    /**@程序引擎的简要寄存器'值
    *
    读取引擎控制1和2
    */
    静态 uint8_t au8EngProgVal2[3]=
    {
    LP5523_REG_ENGCTRL1、
    0、
    0、
    };
    静态 nrf_twi_mngr_transfer_t atTrsfrEngProg2[]={
    LED_REG_READ (au8EngProgVal2)、
    };
    LED_TRANSACTION (tTrnsEngProg2、atTrsfrEngProg2、LED_TRANSID_ENGINE_PROG2);
    
    /**@程序引擎的简要寄存器'值
    *
    *写入引擎控制1和2,停止引擎
    */
    静态 uint8_t au8EngProgVal3a[]=
    {
    LP5523_REG_ENGCTRL1、
    0、//保持(CTRL1)
    };
    静态 nrf_twi_mngr_transfer_t atTrsfrEngProg3A[]={
    LED_REG_WRITE (au8EngProgVal3a)、
    };
    LED_TRANSACTION (tTrnsEngProg3A、atTrsfraEngProg3A、LED_TRANSID_ENGINE_PROG3A);
    
    
    对于@程序引擎
    *
    *写入引擎控制1和2、保持和禁用引擎
    */
    静态 uint8_t au8EngProgVal3b[]=
    {
    LP5523_REG_ENGCTRL2、
    0、//禁用(CTRL2)
    };
    //@程序引擎的简要寄存器'值
    *
    *写入引擎控制1和2,加载引擎
    */
    静态 uint8_t au8EngProgVal3c[]=
    {
    LP5523_REG_ENGCTRL2、
    0、//加载(CTRL2)
    };
    静态 nrf_twi_mngr_transfer_t atTrsfrEngProg3B[]={
    LED_REG_WRITE (au8EngProgVal3b)、
    LED_REG_WRITE (au8EngProgVal3c)、
    };
    LED_TRANSACTION (tTrnsEngProg3B、atTrsfraEngProg3B、LED_TRANSID_ENGINE_PROG3B);
    
    /**@程序引擎的简要寄存器'值
    *
    *写入存储器页选择
    */
    静态 uint8_t au8EngProgVal4a[]=
    {
    LP5523_REG_PROGMEMPAGE、
    0、// 0 -> 00h-0Fh、1 -> 10H-1Fh、2 -> 20H-2Fh、3 -> 30h-3FH、4 -> 40H-4FH、 5 -> 50H-5FH
    // ENG1 00h-1Fh、ENG2 20H-3FH、Eng3 40H-5FH
    };
    //程序引擎的@简要寄存器'值
    *
    编写代码
    */
    静态 uint8_t au8EngProgVal4b[LED_PROG_SIZE]=
    {
    LP5523_REG_PROGMEM
    、};
    //@程序引擎的简要寄存器'值
    *
    *写入引擎起始地址
    */
    静态 uint8_t au8EngProgVal4c[]=
    {
    0、// ENG1 4通道、ENG2 4DH、Eng3 4Eh
    0、// ENG1 00h、ENG2 20H、Eng3 40H
    };
    //@程序引擎的简要寄存器'值
    *
    *写入引擎控制2,运行引擎
    */
    静态 uint8_t au8EngProgVal4d[]=
    {
    LP5523_REG_ENGCTRL2、
    0、//运行引擎(CTRL2)
    };
    静态 nrf_twi_mngr_transfer_t atTrsfrEngProg4[]={
    LED_REG_WRITE (au8EngProgVal4a)、
    LED_REG_WRITE (au8EngProgVal4b)、
    LED_REG_WRITE (au8EngProgVal4c)、
    LED_REG_WRITE (au8EngProgVal4d)、
    };
    LED_TRANSACTION (tTrnsEngProg4、atTrsfraEngProg4、LED_TRANSID_ENGINE_PROG4);
    
    
    void vTransactionCallback (ret_code_t 结果、void * const p_user_data)
    {
    uint32_t userdata =(uint32_t) p_user_data;
    LED_TRANSID eTransId =(LED_TRANSID)((userdata >> 24)& 0xFF);
    LP5523_ENGINE eEng =(LP5523_ENGINE)((userdata >> 16)& 0xFF);
    
    if (eTransId = LED_TRANSID_ENGINE_PROG1)
    {
    if (au8EngProgVal1[1]和 LP5523_VAL_STATUS_ENGINEBUSY)
    {
    //中止
    }
    其他
    {
    TWI_vExec (&tTrnsEngProg2);
    }
    }
    否则、如果(eTransId = LED_TRANSID_ENGINE_PROG2)
    {
    uint8_t u8EngMask1 =(uint8_t) LP5523_VAL_ENGCTRL1_ENG_MASK (eEng);
    uint8_t u8EngMask2 =(uint8_t) LP5523_VAL_ENGCTRL2_ENG_MASK (eEng);
    uint8_t u8EngMask1Inv =(uint8_t)(~u8EngMask1);
    uint8_t u8EngMask2Inv=(uint8_t)(~u8EngMask2);
    //更新值
    //保持(CTRL1)
    au8EngProgVal3a[1]= au8EngProgVal2[1]和 u8EngMask1Inv;
    au8EngProgVal3a[1]|= LP5523_VAL_ENGCTRL1_ENG_HOLD (eEng);
    //禁用(CTRL2)
    au8EngProgVal3b[1]= au8EngProgVal2[2]和 u8EngMask2Inv;
    au8EngProgVal3b[1]|= LP5523_VAL_ENGCTRL2_ENG_DISABLE (eEng);
    //负载(CTRL2)
    au8EngProgVal3c[1]= au8EngProgVal2[2]和 u8EngMask2Inv;
    au8EngProgVal3c[1]|= LP5523_VAL_ENGCTRL2_ENG_LOAD (eEng);
    //检查 CTRL1状态
    //引擎处于运行状态
    if (au8EngProgVal2[1]和 u8EngMask1)
    {
    //首先停止发动机
    TWI_vExec (&T TrnsEngProg3A);
    }
    //引擎处于保持状态
    其他
    {
    //将发动机设置为负载模式
    TWI_vExec (&tTrnsEngProg3B);
    }
    }
    否则、如果(eTransId = LED_TRANSID_ENGINE_PROG3A)
    {
    //在超时时将发动机设置为负载模式
    
    //开始计时器等待 LP5523程序指令结束
    }
    否则、如果(eTransId = LED_TRANSID_ENGINE_PROG3B)
    {
    uint8_t u8EngMask2 =(uint8_t) LP5523_VAL_ENGCTRL2_ENG_MASK (eEng);
    uint8_t u8EngMask2Inv=(uint8_t)(~u8EngMask2);
    //运行(CTRL2)
    au8EngProgVal4d[1]= au8EngProgVal2[2]和 u8EngMask2Inv;
    au8EngProgVal4d[1]|= LP5523_VAL_ENGCTRL2_ENG_run (eEng);
    TWI_vExec (&T TrnsEngProg4);
    }
    否则、如果(eTransId = LED_TRANSID_ENGINE_PROG4)
    {
    TWI_vExec (&tTrnsEngStart1);//启动引擎
    }
    } 

    所有 I2C 传输都有点复杂、但当引擎独立启动时、它工作得非常好。 请注意,此结构共享 xxxEngProgValx 数组,但我确保两个引擎不会同时启动。 当我进行测试时、发动机以几秒钟的间隔启动。

    谢谢你。

    此致、

    约克

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我进行了一些新的测试。 发动机1和3似乎可以并行运行而不会出现问题。 但是、发动机2不能与另一个发动机并行运行、或者有时根本无法运行。

    LP5523是否存在硬件问题(我没有找到任何勘误表)或软件是否有任何问题?

    对于我的任何发动机、起动发动机的代码都相同、但特定于发动机的寄存器(PC、起始地址、存储器程序位置、控制1和2等)除外。

    我在写入程序存储器后还尝试通过读取6 x 32字节(16条指令)来读取程序存储器、每次将 PROG MEM 页 SEL 从0递增到5。 我只读0。

    芯片是否具有读取程序存储器的特殊状态?