XAAR喷墨打印驱动控制

 一、XAAR喷头简介

XS128喷墨打印头

Light and powerful: with a compact footprint and light carriage weight of only 16 grams, the agile Xaar 128 printhead is ideal for applications where weight and size are a key factor to design.

Ease of integration: specifically engineered with a simple electronic interface, the Xaar 128 promotes quick and easy integration into printers making it the ideal choice for those wanting to enter into a variety of markets.

二、硬件原理图设计

三、墨水系统

.

四、固件驱动程序


关于XAAR喷头部分的驱动程序采用模块化设计,ARM程序部分加入XAAR.h之后,完成硬件相关接口的配置即可。

XAAR.h

#ifndef __XAAR_H_
#define __XAAR_H_
#include <TKIT_Header\TKIT.h>
#include "XAAR_cfg.h"

#define XAAR_ERR                INT8U   //错误码定义
#define ERR_XAAR_SUCCESS        0       //正常
#define ERR_XAAR_SPEED          1       //喷头速度不匹配
#define ERR_XAAR_NOZZLE         2       //喷嘴数量不匹配
#define ERR_XAAR_TEMPER         3       //喷头温度报警
#define ERR_XAAR_TRIG           4       //喷墨触发信号超时
#define ERR_XAAR_READY          5       //喷头空闲信号超时
#define ERR_XAAR_BMP            6       //图片格式错误

/* Layer specfication ---------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------
-- 
-- XAAR 喷墨头控制应用层功能函数
-- 调用硬件配置接口 XAAR_cfg.h的函数
-- 
-- 建议
-- 或者确保XAAR电源信号上电处于关闭状态
-- 

    XAAR_init();

    BMP_Readfile(&bmp,NULL,NULL);   //Read print file
    XAAR_PowerProcess( TRUE );      //Power up
    TKIT_DlyTicks(TKIT_DLY_100MS);
    result = XAAR_PrintBmp(speed,&bmp,NULL,TEST);
    XAAR_PowerProcess( FALSE );     //Power down

-------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------*/

//XAAR 初始化流程
//上电之后调用一次,所有需要初始化的在此函数
void        XAAR_init                             (void);
//XAAR terminal 控制台
void        TerminalHandler_XAAR                  (INT8U * para);



/* Layer specfication ---------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------
-- 
-- XAAR 喷墨头控制逻辑层
-- 
--                    
-------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------*/

extern INT32U    XAAR_LoadCount;                //载入数据的次数
extern INT32U    XAAR_Percent;                  //喷墨浓度百分比


//Fire clock 调用的函数
void        XAAR_FireIsr                          (void);
//启动fire
void        XAAR_FireStartStop                    (BOOLEAN en);

//设置load数据地址
void        XAAR_LoadAddrSet                      (INT8U* addr);
//Load data. Ready ISR
//Ready 中断调用
//优先级设置最高
void        XAAR_LoadIsr                          (void);


//强制快速关闭XAAR所有电源
void        XAAR_PowerForceOff                    (void);
//XAAR 上电或断电流程
void        XAAR_PowerProcess                     (BOOLEAN on_off);


/* Layer specfication ---------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------
-- 
-- XAAR 喷墨头控制应用层
-- 阻塞执行
-- 
-------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------*/

//配置打印参数
//Percent    :出墨浓度  0--100
XAAR_ERR     XAAR_PrintArg                        (INT8U Percent);


//暂不支持灰度打印,可尝试灰度处理
//打印BMP位图
//p_bmp     : bmp 位图
//speed     : 模拟打印速度 mm/s
//trig      : 每一行的触发消息,如果不需要可输入NULL
//
//speed / trig,选择其一使用,例如通过码盘或者中断时间触发可使用trig消息进行触发每一行打印
//          TKIT_MsgPost(trig, 0 );//打印一行
//          TKIT_MsgPost(trig, 0 );//打印一行
//          由于此函数阻塞运行,触发信号应该在中断里发出
XAAR_ERR     XAAR_PrintBmp                        (INT32U speed,TKIT_EVENT *trig,BMP * p_bmp);



//打印数据区域
XAAR_ERR     XAAR_PrintBuffer                     (INT32U speed,TKIT_EVENT *trig,INT8U * buf,INT32U width,INT32U heigh);

//打印测试
XAAR_ERR     XAAR_PrintTest                       (INT32U speed,TKIT_EVENT *trig,BOOLEAN black,INT32U heigh);


/* Layer specfication ---------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------
-- 
-- 
-- 
-------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------*/
#endif //__XAAR_H_

XAAR_CFG.C硬件接口配置

/* Layer specfication -------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------
--
-- This layer for initialization
--
-----------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------*/
#include "XAAR_cfg.h"
#include "includes.h"

//Ready isr
void EXTI15_10_IRQHandler(void)
{
    EXTI_ClearITPendingBit(EXTI_Line12);
    XAAR_LoadIsr();
}
//点火频率控制函数
void TIM2_IRQHandler(void)
{
    TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
    XAAR_FireIsr();
}
//XAAR 点火频率控制
//单位Hz
void        XAAR_FireClk(INT32U clk)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    NVIC_InitTypeDef         NVIC_InitStructure;

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
    NVIC_InitStructure.NVIC_IRQChannel                   = TIM2_IRQn;      
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority        = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd                = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
    //TIM_InternalClockConfig(TIM2);
    //TIM_TimeBaseStructure.TIM_Period        = SystemCoreClock/clk-1; // 72M 
    TIM_TimeBaseStructure.TIM_Prescaler     = 0;  //Prescaler
    TIM_TimeBaseStructure.TIM_Period        = SystemCoreClock/clk-1;
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;
    TIM_TimeBaseStructure.TIM_CounterMode   = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
    TIM_ARRPreloadConfig(TIM2, ENABLE);
    TIM_Cmd(TIM2, ENABLE);
    TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//Interrupt enable
}

//XAAR硬件端口初始化
//clk  : 128模块输入 1MHz
//sck  : SPI sck
void        XAARCFG_PortInit                      (INT32U clk,INT32U sck)
{
    GPIO_InitTypeDef         GPIO_InitStructure;
    SPI_InitTypeDef          SPI_InitStructure;
    TIM_OCInitTypeDef        TIM_OCInitStructure;
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    NVIC_InitTypeDef         NVIC_InitStructure;
    EXTI_InitTypeDef         EXTI_InitStructure;

    ///////////////////// OUTPUT /////////////////////////////////
    ///////////////////// OUTPUT /////////////////////////////////
    ///////////////////// OUTPUT /////////////////////////////////
    //Power 35V clk
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB,&GPIO_InitStructure);
    GPIO_ResetBits(GPIOB,GPIO_Pin_10);
    TKIT_IO_Cfg(GPIO_OUT_PTPOWER,GPIO_Pin_10,&GPIOB->MODER,&GPIOB->ODR,&GPIOB->ODR,&GPIOB->IDR);
    TKIT_IO_Set(GPIO_OUT_PTPOWER,IO_MODEPWM,IO_DIR_OUT,0,TKIT_DLY_100MS,0,2,1);
    //Power 35V clear
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_11;
    GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB,&GPIO_InitStructure);
    GPIO_ResetBits(GPIOB,GPIO_Pin_11);

    //XAAR nReset /////////////////////////////
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_6;
    GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOC,&GPIO_InitStructure);
    GPIO_ResetBits(GPIOC,GPIO_Pin_6);//GPIO_ResetBits //GPIO_SetBits

    //XAAR VPPH /////////////////////////////

    //XAAR VDD /////////////////////////////

    //XAAR Phase /////////////////////////////
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_7;
    GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOC,&GPIO_InitStructure);
    GPIO_ResetBits(GPIOC,GPIO_Pin_7);//GPIO_ResetBits //GPIO_SetBits

    //XAAR nFIRE /////////////////////////////
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_4;
    GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOF,&GPIO_InitStructure);
    GPIO_SetBits(GPIOF,GPIO_Pin_4);//GPIO_ResetBits //GPIO_SetBits

    //XAAR nSS1 /////////////////////////////
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_12;
    GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB,&GPIO_InitStructure);
    GPIO_SetBits(GPIOB,GPIO_Pin_12);//GPIO_ResetBits //GPIO_SetBits

    //XAAR nSS2 /////////////////////////////
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_9;
    GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOC,&GPIO_InitStructure);
    GPIO_SetBits(GPIOC,GPIO_Pin_9);//GPIO_ResetBits //GPIO_SetBits

    
    ///////////////////// INPUT //////////////////////////////////
    ///////////////////// INPUT //////////////////////////////////
    ///////////////////// INPUT //////////////////////////////////
    //XAAR Ready /////////////////////////////
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IN;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_12;
    GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOC,&GPIO_InitStructure);
    //Ready interrupt
    EXTI_ClearITPendingBit(EXTI_Line12);
    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC,EXTI_PinSource12);
    EXTI_InitStructure.EXTI_Line = EXTI_Line12;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure);

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
    NVIC_InitStructure.NVIC_IRQChannel                   = EXTI15_10_IRQn;      
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority        = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd                = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

    //XAAR Error /////////////////////////////
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IN;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_2;
    GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOD,&GPIO_InitStructure);
    TKIT_IO_Cfg(GPIO_IN_PTERROR,GPIO_Pin_2,&GPIOD->MODER,&GPIOD->ODR,&GPIOD->ODR,&GPIOD->IDR);
    TKIT_IO_Set(GPIO_IN_PTERROR,IO_MODEGPIO,IO_DIR_IN,0,TKIT_DLY_100MS,0,TKIT_DLY_2S,TKIT_DLY_1S);


    ///////////////////// ADVANCE ////////////////////////////////
    ///////////////////// ADVANCE ////////////////////////////////
    ///////////////////// ADVANCE ////////////////////////////////
    PrintfDebug("<XAAR_cfg>System clock=%d,XAAR clk=%d\r\n",SystemCoreClock,clk);
    //XAAR clock //////////////////////////////PC8
    GPIO_PinAFConfig(GPIOC,GPIO_PinSource8,GPIO_AF_2);//PC8 TIM3-CH3
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_8;
    GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOC,&GPIO_InitStructure);

    TIM_TimeBaseStructure.TIM_Prescaler     = 0;//SystemCoreClock/4000000-1;  //64M - > 4M
    TIM_TimeBaseStructure.TIM_Period        = SystemCoreClock/clk-1; 
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;
    TIM_TimeBaseStructure.TIM_CounterMode   = TIM_CounterMode_Up;
    TIM_OCInitStructure.TIM_OCMode      = TIM_OCMode_PWM1;
    TIM_OCInitStructure.TIM_Pulse       = TIM_TimeBaseStructure.TIM_Period/2;
    TIM_OCInitStructure.TIM_OCPolarity  = TIM_OCPolarity_High;  
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    //Init TIM
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
    //TIM3 - CH2
    //TIM_ClearFlag(TIM3,TIM_FLAG_CC2);
    //TIM_OC2Init(TIM3,&TIM_OCInitStructure);
    //TIM3 - CH3
    TIM_ClearFlag(TIM3,TIM_FLAG_CC3);
    TIM_OC3Init(TIM3,&TIM_OCInitStructure);
    TIM_ARRPreloadConfig(TIM3, ENABLE);
    TIM_Cmd(TIM3, ENABLE);

    /*
    //定时器中断功能
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_4;
    GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOF,&GPIO_InitStructure);

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
    NVIC_InitStructure.NVIC_IRQChannel                   = TIM3_IRQn;      
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority        = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd                = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
    //TIM_InternalClockConfig(TIM3);
    //TIM_TimeBaseStructure.TIM_Period        = SystemCoreClock/clk-1; // 72M 
    TIM_TimeBaseStructure.TIM_Prescaler     = 18000-1;  //Prescaler  72->4Mhz
    TIM_TimeBaseStructure.TIM_Period        = 40-1;   //4M -> 1M
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;
    TIM_TimeBaseStructure.TIM_CounterMode   = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
    TIM_ARRPreloadConfig(TIM3, ENABLE);
    TIM_Cmd(TIM3, ENABLE);
    TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);//Interrupt enable
    */


    //XAAR SPI Port //////////////////////
    GPIO_PinAFConfig(GPIOB,GPIO_PinSource13,GPIO_AF_5);//SCK
    GPIO_PinAFConfig(GPIOB,GPIO_PinSource14,GPIO_AF_5);//MISO
    GPIO_PinAFConfig(GPIOB,GPIO_PinSource15,GPIO_AF_5);//MOSI
    // Configure SPI2 pins: SCK, MISO and MOSI
    //GPIO_InitStructure.GPIO_Pin    = (GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15);
    GPIO_InitStructure.GPIO_Pin    = (GPIO_Pin_13 | GPIO_Pin_15);
    GPIO_InitStructure.GPIO_Mode   = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_Speed  = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_OType  = GPIO_OType_PP ;//GPIO_OType_OD
    GPIO_InitStructure.GPIO_PuPd   = GPIO_PuPd_UP;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin    = ( GPIO_Pin_14 );
    GPIO_InitStructure.GPIO_PuPd   = GPIO_PuPd_DOWN;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    // SPI2 configuration
    SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
    SPI_InitStructure.SPI_Mode      = SPI_Mode_Master;
    SPI_InitStructure.SPI_DataSize  = SPI_DataSize_8b;
    SPI_InitStructure.SPI_CPOL      = SPI_CPOL_High;
    SPI_InitStructure.SPI_CPHA      = SPI_CPHA_2Edge;
    SPI_InitStructure.SPI_NSS       = SPI_NSS_Soft;
    //2M SPI_BaudRatePrescaler_16
    //1M SPI_BaudRatePrescaler_32
    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16; //SPI_BaudRatePrescaler_16;//64/32 / 2M
    //SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8; //SPI_BaudRatePrescaler_16;//64/32 / 2M
    SPI_InitStructure.SPI_FirstBit  = SPI_FirstBit_MSB;
    //SPI_InitStructure.SPI_FirstBit  = SPI_FirstBit_LSB;
    SPI_InitStructure.SPI_CRCPolynomial = 7;
    SPI_Init(SPI2, &SPI_InitStructure);
    SPI2->CR2 |= SPI_CR2_FRXTH ;        //由于接收8bit数据,设定阀值为8-bit
    SPI_Cmd(SPI2, ENABLE);
}
/**********************************************************************************************************
*                                            
*
* Description: 电源和复位信号控制
*
* Arguments  : 
*
* Returns    : 
**********************************************************************************************************/
//35V电源控制
//压控电压是否输出控制
void        XAARCFG_PowerVPPH                     (BOOLEAN on_off)
{
    if( on_off ){  GPIO_SetBits(  GPIOB,GPIO_Pin_11);  }
    else        {  GPIO_ResetBits(GPIOB,GPIO_Pin_11);  }
}
//5V逻辑电压控制
void        XAARCFG_PowerVDD                      (BOOLEAN on_off)
{
    //if( on_off ){  GPIO_SetBits(  GPIOB,GPIO_Pin_2);  }
    //else        {  GPIO_ResetBits(GPIOB,GPIO_Pin_2);  }
}
//XAAR Reset 电平输出
//IO_LEV_HIGH
//IO_LEV_LOW
void        XAARCFG_nResetPort                     (BOOLEAN L_H)
{
    if( L_H ){  GPIO_SetBits(  GPIOC,GPIO_Pin_6);  }
    else     {  GPIO_ResetBits(GPIOC,GPIO_Pin_6);  }
}
/**********************************************************************************************************
*                                            
*
* Description: 数据以及控制信号
*
* Arguments  : 
*
* Returns    : 
**********************************************************************************************************/
//Active low error output signal that indicates high ink temperature.
//温度报警信号
//Therefore nFAULT should only be sampled while READY is high.
BOOLEAN     XAARCFG_nTempError                    (void)
{
    if( XAARCFG_Ready() )
    {
        return GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_2);
    }
    return HIGH;
}
//打印数据准备完毕
BOOLEAN     XAARCFG_Ready                         (void)
{
    return GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_12);
}
//打印Phase选择
void        XAARCFG_Phase                         (BOOLEAN L_H)
{
    if( L_H ){  GPIO_SetBits(  GPIOC,GPIO_Pin_7);  }
    else     {  GPIO_ResetBits(GPIOC,GPIO_Pin_7);  }
}
//启动喷墨触发信号
//The nFIRE is sampled while READY is active (high level).
void        XAARCFG_nFIRE                         (BOOLEAN L_H)
{
    if( L_H ){  GPIO_SetBits(  GPIOF,GPIO_Pin_4);    }
    else     {  GPIO_ResetBits(GPIOF,GPIO_Pin_4);  }
}

//MOSI通信片选信号
//chip-1 / chip-2
void        XAARCFG_nSS1                          (BOOLEAN L_H)
{
    if( L_H ){  GPIO_SetBits(  GPIOB,GPIO_Pin_12);  }
    else     {  GPIO_ResetBits(GPIOB,GPIO_Pin_12);  }
}
void        XAARCFG_nSS2                          (BOOLEAN L_H)
{
    if( L_H ){  GPIO_SetBits(  GPIOC,GPIO_Pin_9);  }
    else     {  GPIO_ResetBits(GPIOC,GPIO_Pin_9);  }
}

//发送一个字节的打印数据到当前行
//dir 1: 低位先发  推荐
//dir 0: 高位先发
BOOLEAN      XAARCFG_SendData                      (INT8U byte,BOOLEAN dir)
{
    INT8U   bit,u8;
    INT32U  TimeOut=0;
    if( dir ){
        SPI_SendData8(SPI2,byte);
    }
    else{
        u8 = byte;
        byte = 0;
        for(bit=0;bit<8;bit++){ if( u8&(1<<bit) )byte|=(1<<(7-bit)); }
        SPI_SendData8(SPI2,byte);
    }
    //等待发送结束
    while( SPI_TransmissionFIFOStatus_Empty!=SPI_GetTransmissionFIFOStatus(SPI2) )
    {
        TimeOut++;
        if( TimeOut>=99999 ) return FALSE;
    }
    return TRUE;
}

XAAR_Terminal.c终端测试接口

#include "XAAR.h"
/*
** XAAR control
*/
void    TerminalHandler_XAAR(INT8U * para)
{
#if 1
    char            *endp;
    INT8U           u8;
    INT32U          u32;
    INT32U          u32_speed;
    INT32U          u32_addr;
    char            Buf[1024*7],Arg[64];
    BMP             bmp;

    Terminal_UserNameModify("   xaar");
    Printf("   ====== XAAR Printer Terminal platform ======\r\n");
    
    Printf("   Command:  \r\n");
    Printf("   'fire\'    nFire port control[1,0]\r\n");
    Printf("   'SS1\'     nSS1 port control[1,0]\r\n");
    Printf("   'SS2\'     nSS2 port control[1,0]\r\n");
    Printf("   'rst\'     nReset port control[1,0]\r\n");
    Printf("   'phase\'   Phase port control[1,0]\r\n");
    Printf("   'clk\'     Clock control[clk,spi sck]\r\n");
    Printf("   '35v\'     35v Printer power control[1,on]\r\n");
    Printf("   --------------------------------------------\r\n");
    Printf("   'power\'   Power control. VDD->VPPH->nReset.[1:On, 0:Off]\r\n");
    Printf("   'send\'    Send data shift[data,send-count]\r\n");
    Printf("   'bmp\'     Print bmp test[bmp address,speed:mm/s ]\r\n");
    Printf("   Please input command:\r\n");
    
    TKIT_DlyTicks(TKIT_DLY_100MS);
    while(1)
    {
        //读取命令
        std_MemSet( (INT8U*)Arg,0x00,sizeof(Arg)/sizeof(Arg[0]) );
        GetsExt((INT8U*)Buf,(INT8U*)Arg);
        //退出测试平台命令
        if(0 == std_StringCmpExt("exit%EXIT",Buf))break;

        //35V
        if(0 == std_StringCmpExt("35v%35V",Buf))
        {
            u8 = std_StringToulExt((char*)Arg,&endp,0,' ');XAARCFG_PowerVPPH(u8);
            Printf("   >>Set 35V:%d[On if >=1]\r\n",u8);
        }
        //fire 控制
        if(0 == std_StringCmpExt("fire%FIRE",Buf))
        {
            u8 = std_StringToulExt((char*)Arg,&endp,0,' ');XAARCFG_nFIRE(u8);
            Printf("   >>Set XAAR nFire:%d[On if >=1]\r\n",u8);
        }
        //SS1/SS2 control
        if(0 == std_StringCmpExt("ss1%SS1",Buf))
        {
            u8 = std_StringToulExt((char*)Arg,&endp,0,' ');XAARCFG_nSS1(u8);
            Printf("   >>Set nSS1:%d[On if >=1]\r\n",u8);
        }
        if(0 == std_StringCmpExt("ss2%SS2",Buf))
        {
            u8 = std_StringToulExt((char*)Arg,&endp,0,' ');XAARCFG_nSS2(u8);
            Printf("   >>Set nSS2:%d[On if >=1]\r\n",u8);
        }
        if(0 == std_StringCmpExt("rst%RST",Buf))
        {
            u8 = std_StringToulExt((char*)Arg,&endp,0,' ');XAARCFG_nResetPort(u8);
            Printf("   >>Set nReset:%d[On if >=1]\r\n",u8);
        }
        if(0 == std_StringCmpExt("phase%PHASE",Buf))
        {
            u8 = std_StringToulExt((char*)Arg,&endp,0,' ');XAARCFG_Phase(u8);
            Printf("   >>Set Phase:%d[On if >=1]\r\n",u8);
        }
        if(0 == std_StringCmpExt("clk%CLK",Buf))
        {
            u32 = std_StringToulExt((char*)Arg,&endp,0,' ');
            u32_speed = std_StringToulExt(endp+1,&endp,0,' ');
            XAARCFG_PortInit(u32,u32_speed);
            Printf("   >>Set Clk:%d, SPI clk:%d\r\n",u32,u32_speed);
        }

        //上电或断电流程
        if(0 == std_StringCmpExt("power%POWER",Buf))
        {
            u8 = std_StringToulExt((char*)Arg,&endp,0,' ');
            XAAR_PowerProcess(u8);
            Printf("   >>Start XAAR power process:%d[On if >=1]\r\n",u8);
        }
        //输出打印数据
        if(0 == std_StringCmpExt("send%SEND",Buf))
        {
            u8  = std_StringToulExt((char*)Arg,&endp,0,' ');
            u32 = std_StringToulExt(endp+1,&endp,0,' ');
            if(0==u32)u32=1;
            Printf("   >>Send data:0x%02x to printer. Send count=%d ... ",u8,u32);

            TKIT_TimerValCreate(&u32_speed);
            while(u32--)
            {
                XAARCFG_SendData(u8,1);
            }
            Printf("   Time=%dms,Done!\r\n", TKIT_TICKS2MS(u32_speed) );
            TKIT_TimerValDelete(&u32_speed);
        }
        //打印一个bmp位图测试
        if(0 == std_StringCmpExt("bmp%BMP",Buf))
        {
            u32_addr  = std_StringToulExt((char*)Arg,&endp,0,' ');
            u32_speed = std_StringToulExt(endp+1,&endp,0,' ');
            bmp.SetBuf  = (INT8U*)Buf;
            bmp.SetBufLen = sizeof(Buf);
            Printf("     BMP Addr=0x%08x,Speed=%dmm/s,BufferLen=%d \r\n",u32_addr,u32_speed,bmp.SetBufLen );

            TKIT_TimerValCreate(&u32);
            if( TRUE==BMP_Readfile(&bmp,u32_addr,NULL,NULL) )
            {
                Printf("     Read bmp success.time=%dms \r\n", TKIT_TICKS2MS(u32) );
            }
            else
            {
                Printf("     Read bmp error . time=%dms \r\n", TKIT_TICKS2MS(u32) );
            }

            //上电
            TKIT_TimerValClear(&u32);
            XAAR_PowerProcess( TRUE );
            Printf("     Power On process.time=%dms \r\n", TKIT_TICKS2MS(u32) );

            TKIT_TimerValClear(&u32);
            if( XAAR_PrintBmp(u32_speed,NULL,&bmp) )
            {
                Printf("     Print bmp success.time=%dms \r\n", TKIT_TICKS2MS(u32) );
            }
            else
            {
                Printf("     Print bmp error.time=%dms \r\n", TKIT_TICKS2MS(u32) );
            }
            //断电
            TKIT_TimerValClear(&u32);
            XAAR_PowerProcess( FALSE );
            Printf("     Power Off process.time=%dms \r\n", TKIT_TICKS2MS(u32) );

            TKIT_TimerValDelete(&u32);
        }
        /////end while
    }
    Printf("   >>XAAR control finished.\r\n");
    Terminal_UserNameModify(NULL);
#else
    Printf("   >>XAAR control disable\r\n");
#endif
}

猜你喜欢

转载自www.cnblogs.com/lewismotion/p/11061678.html