/* .h */
#ifndef _MBI6023_h
#define _MBI6023_h
#include "spi.h"
typedef enum
{
MBI6023_Grey_16bit,
MBI6023_Grey_10bit
}MBI6023_Grey;
typedef struct {
INT16U Ch_id;
INT16U Driver_num;
MBI6023_Grey Grey_Level;
INT16U MBI6023_Header[3];
}MBI6023_Chip;
INT16U check_parity(INT16U data);
static void MBI6023_Send_Header(MBI6023_Chip * pMBI_Chip);
static void MBI6023_Send_Color(MBI6023_Chip * pMBI_Chip,INT16U *data);
static void MBI6023_Senddata(MBI6023_Chip * pMBI_Chip,INT16U *data);
#endif
/* .c */
#include "MBI6023.h"
INT16U check_parity(INT16U data)
{
data^=data>>8;
data^=data>>4;
data^=data>>2;
data^=data>>1;
data&=1;
return data;
}
void Delay_ms(INT16U ms)
{
volatile INT16U i;
for(i=0;i<ms*1000;i++);
}
INT16U MBI6023_Header;
static void MBI6023_Send_Header(MBI6023_Chip * pMBI_Chip)
{
INT16U H,P,A,L;
INT16U driver_num = pMBI_Chip->Driver_num;
INT16U * MBI6023_Header = pMBI_Chip->MBI6023_Header;
MBI6023_Grey Grey_Level = pMBI_Chip->Grey_Level;
if(MBI6023_Grey_16bit == Grey_Level)//calculate H,P,A,L according Grey grade
{
H = 0x3f;
A = 0x00;
L = driver_num-1;
P = check_parity(L)|(check_parity(A)<<1)||(check_parity(H)<<2);
P = P | (check_parity(P)<<3);
}
else
{
H = 0x2b;
A = 0x00;
L = driver_num-1;
P = check_parity(L)|(check_parity(A)<<1)||(check_parity(H)<<2);
P = P | (check_parity(P)<<3);
}
MBI6023_Header[0]=MBI6023_Header[1]=MBI6023_Header[2]=0;
if(MBI6023_Grey_16bit == Grey_Level) //Generate Package Head according Grey grade
{
MBI6023_Header[2] = (H<<10) | A;
MBI6023_Header[1] = (H<<10) | L;
MBI6023_Header[0] = (P<<12) | L;
}
else
{
MBI6023_Header[2] = (H<<4) | P;
MBI6023_Header[1] = A;
MBI6023_Header[0] = L;
}
MBI6023_Send_Node_Bits(pMBI_Chip,MBI6023_Header[2]);
MBI6023_Send_Node_Bits(pMBI_Chip,MBI6023_Header[1]);
MBI6023_Send_Node_Bits(pMBI_Chip,MBI6023_Header[0]);
}
static void MBI6023_Send_Color(MBI6023_Chip * pMBI_Chip,INT16U *data)
{
INT16U i;
INT16U index = pMBI_Chip-> Driver_num*12;
for(i=0;i<index;i++)
MBI6023_Send_Node_Bits(pMBI_Chip,data[index-i-1]);
}
static void MBI6023_Senddata(MBI6023_Chip * pMBI_Chip,INT16U *data)
{
Delay_ms(10);
MBI6023_Send_Header(pMBI_Chip);
MBI6023_Send_Color(pMBI_Chip,data);
}