TA的每日心情 | 奋斗 2023-7-8 16:17 |
---|
签到天数: 971 天 连续签到: 1 天 [LV.10]以坛为家III
|
The DA8521 is a serial-input, 64-output, cascadable, bistable electronic paper display driver.
Display data is serially clocked into a 64-bit shift register. When the shift register is loaded, the data is parallel-latched into a 64-bit latch register. The outputs of this register drive the high voltage display drivers
Data on the DATAIN input is serially clocked into the shift register on each rising edge of CLKIN.
Data is clocked into the device MSB first, i.e. the first clocked data bit will be DD63.
串行输入,64位输出,传输是MSB方式,位移传输 接收数据由DATDIN->DD0->....->DD63->DATAOUT 可以理解为端口扩展。
程序上就按照 时序图来编写即可
在硬件上分为 三种模式
单独
多芯片,单独控制
多芯片,级联控制
还有一个要注意的问题是 传输是MSB方式,DA8521 在DD00~DD63 与 水墨屏引脚注意逆序,方便操作
实例例程- #include "iodefine.h"
- #define SEG_TABLE1_TopElectrode ((uint32)0x00000001)
- #define SEG_TABLE1_FieldbBackgroudn ((uint32)0x00000002)
- #define SEG_TABLE1_UnitDegree ((uint32)0x00000004)
- #define SEG_TABLE1_UnitmA ((uint32)0x00000008)
- #define SEG_TABLE1_UnituA ((uint32)0x00000010)
- #define SEG_TABLE1_NumB ((uint32)0x00000FE0)
- #define SEG_TABLE1_NumB_Offset ((uint8)(6-1))
- #define SEG_TABLE1_NumC ((uint32)0x00001000)
- #define SEG_TABLE1_NumD ((uint32)0x000FE000)
- #define SEG_TABLE1_NumD_Offset ((uint8)(14-1))
- #define SEG_TABLE1_NumE ((uint32)0x00100000)
- #define SEG_TABLE1_NumF ((uint32)0x0FE00000)
- #define SEG_TABLE1_NumF_Offset ((uint8)(22-1))
- #define SEG_TABLE1_LogBench ((uint32)0x10000000)
- #define SEG_TABLE1_LogHumanWalk ((uint32)0x20000000)
- #define SEG_TABLE1_LogAngleGauge ((uint32)0x40000000)
- #define SEG_TABLE1_LogHandHold ((uint32)0x80000000)
- #define SEG_TABLE2_LogHumanRun ((uint32)0x00000001)
- #define SEG_TABLE2_LogBattery ((uint32)0x00000002)
- #define SEG_TABLE2_LogPower ((uint32)0x00000004)
- #define SEG_TABLE2_LogEink ((uint32)0x00000008)
- /********************************************************/
- #define ED_STANDBYB_HIGH {P3_bit.no1 = 1;} //Config ED_STANDBYB pin high
- #define ED_STANDBYB_LOW {P3_bit.no1 = 0;} //Config ED_STANDBYB pin low
- #define ED_BLANK_HIGH {P3_bit.no0 = 1;} //Config ED_BLANK pin high
- #define ED_BLANK_LOW {P3_bit.no0 = 0;} //Config ED_BLANK pin low
- #define ED_CS_HIGH {P0_bit.no5 = 1;} //Config ED_CS pin high
- #define ED_CS_LOW {P0_bit.no5 = 0;} //Config ED_CS pin low
- #define ED_LATCH_HIGH {P0_bit.no6 = 1;} //Config ED_LATCH pin high
- #define ED_LATCH_LOW {P0_bit.no6 = 0;} //Config ED_LATCH pin low
- #define ED_CLKIN_HIGH {P7_bit.no0 = 1;} //Config ED_CLKIN pin high
- #define ED_CLKIN_LOW {P7_bit.no0 = 0;} //Config ED_CLKIN pin low
- #define ED_OUTPUT_HIGH {P7_bit.no2 = 1;} //Config ED_DATAIN pin high
- #define ED_OUTPUT_LOW {P7_bit.no2 = 0;} //Config ED_DATAIN pin low
- void einkpin_outhigh(void)
- {
- ED_CLKIN_LOW; //Config ED_CLKIN pin low
- ED_OUTPUT_HIGH; //Config the corresponding eink pin high
- ED_CLKIN_HIGH; //Config ED_CLKIN pin high, clock pulse
- }
- void einkpin_outlow(void)
- {
- ED_CLKIN_LOW; //Config ED_CLKIN pin low
- ED_OUTPUT_LOW; //Config the corresponding eink pin low
- ED_CLKIN_HIGH; //Config ED_CLKIN pin high, clock pulse
- }
- void eink_latchoutput(void)
- {
- uint32_t mTemp = 0;
- ED_CS_HIGH; //Config ED_CS pin high
- ED_LATCH_HIGH; //Config ED_LATCH pin high
- NOP();
- NOP();
- ED_LATCH_LOW; //Config ED_LATCH pin low
- ED_CS_LOW; //Config ED_CS pin low
- ED_BLANK_LOW; //Config ED_BLANK pin low
- for(mTemp = 0; mTemp<65530; mTemp++) {
- NOP();
- }
- ED_BLANK_HIGH; //Config ED_BLANK pin high
- ED_CLKIN_LOW; //Config ED_CLKIN pin low
- }
- void eink_globalupdate_black(void)
- {
- uint32_t mTemp = 0;
- //ED_STANDBYB_HIGH; //Config ED_STANDBYB pin high, turn on eink driver
- einkpin_outlow(); //Config pin1 of eink low
- for (mTemp=2; mTemp<=64; mTemp++) {
- einkpin_outhigh();//Config all the other 63 pins output of DA8521 high
- }
- eink_latchoutput();
- //ED_STANDBYB_LOW; //Config ED_STANDBYB pin low, turn off eink driver
- }
- void eink_globalupdate_white(void)
- {
- uint32_t mTemp = 0;
- //ED_STANDBYB_HIGH; //Config ED_STANDBYB pin high, turn on eink driver
- einkpin_outhigh(); //Config pin1 of eink high
- for (mTemp=2; mTemp<=64; mTemp++) {
- einkpin_outlow();//Config all the other 63 pins output of DA8521 low
- }
- eink_latchoutput();
- //ED_STANDBYB_LOW; //Config ED_STANDBYB pin low, turn off eink driver
- }
- void elink_writeOneData(uint32_t ulData)
- {
- uint32_t ulTemp = 0x80000000;
- uint8_t ucTemp = 0;
- for(ucTemp = 32,ulTemp = (uint32_t)0x00000001; ucTemp>0; ucTemp--) {
- if( (ulData&ulTemp)==ulTemp ) {
- einkpin_outhigh();
- } else {
- einkpin_outlow();
- }
- ulTemp=ulTemp<<1;
- }
- }
- void einkWriteDate(uint32 ulDataLow, uint32 ulDataHigt)
- {
- ED_STANDBYB_HIGH; //Config ED_STANDBYB pin high, turn on eink driver
- //eink_globalupdate_black();//low ->high
- //elink_writeOneData((~SEG_TABLE1_TopElectrode));
- //elink_writeOneData(0xffffffff);
- elink_writeOneData(((ulDataLow)|SEG_TABLE1_TopElectrode)&(~(SEG_TABLE1_FieldbBackgroudn)));
- elink_writeOneData(ulDataHigt);
- eink_latchoutput();
- //eink_globalupdate_white();//high->low
- //elink_writeOneData(SEG_TABLE1_TopElectrode);
- //elink_writeOneData( (uint32)0 );
- elink_writeOneData((ulDataLow)|(SEG_TABLE1_TopElectrode));
- elink_writeOneData(ulDataHigt);
- eink_latchoutput();
- elink_writeOneData(ulDataLow&(~(SEG_TABLE1_FieldbBackgroudn|SEG_TABLE1_TopElectrode)));
- elink_writeOneData(ulDataHigt);
- eink_latchoutput();
- ED_STANDBYB_LOW; //Config ED_STANDBYB pin low, turn off eink driver
- }
- void einkWriteDate(uint32 ulDataLow, uint32 ulDataHigt)
- {
- ED_STANDBYB_HIGH; //Config ED_STANDBYB pin high, turn on eink driver
- //eink_globalupdate_black();//low ->high
- //elink_writeOneData((~SEG_TABLE1_TopElectrode));
- //elink_writeOneData(0xffffffff);
- elink_writeOneData(((ulDataLow)|SEG_TABLE1_TopElectrode)&(~(SEG_TABLE1_FieldbBackgroudn)));
- elink_writeOneData(ulDataHigt);
- eink_latchoutput();
- //eink_globalupdate_white();//high->low
- //elink_writeOneData(SEG_TABLE1_TopElectrode);
- //elink_writeOneData( (uint32)0 );
- elink_writeOneData((ulDataLow)|(SEG_TABLE1_TopElectrode));
- elink_writeOneData(ulDataHigt);
- eink_latchoutput();
- elink_writeOneData(ulDataLow&(~(SEG_TABLE1_FieldbBackgroudn|SEG_TABLE1_TopElectrode)));
- elink_writeOneData(ulDataHigt);
- eink_latchoutput();
- ED_STANDBYB_LOW; //Config ED_STANDBYB pin low, turn off eink driver
- }
- void elink_Init(void)
- {
- ED_STANDBYB_HIGH; //Config ED_STANDBYB pin high, turn on eink driver
- ED_BLANK_HIGH; //Config ED_BLANK pin high
- ED_CS_LOW; //Config ED_CS pin low
- ED_LATCH_LOW; //Config ED_LATCH pin low
- ED_CLKIN_LOW; //Config ED_CLKIN pin low
- eink_globalupdate_black();
- eink_globalupdate_white();
- //elink_power();
- einkWriteDate(SEG_TABLE1_UnitDegree|SEG_TABLE1_LogAngleGauge , SEG_TABLE2_LogPower);
- ED_STANDBYB_LOW; //Config ED_STANDBYB pin low, turn off eink driver
- }
复制代码 应用过程中还要注意一个问题是,水墨屏是一个连续渐变的过程,所以要连续出现几次才能更新显示,而初始时不受之约限
|
|