
|

|
BC7281应用文章——TMS320F2812开发板键盘程序
作者: 上海胜诺通信技术有限公司
//---------------------------------------------------------------------------------------
//-------------------------设置BC7281端口程序
----------------------------------------------
// BC_DAT = P26 = GPIOF10
void set_BC_DAT(int state)
{
EALLOW;
GpioMuxRegs.GPFDIR.bit.GPIOF10 = 1; //dat 口设置成输出
EDIS;
switch(state)
{
case 0:
GpioDataRegs.GPFDAT.bit.GPIOF10 = 0; // clear BC_DAT.
break;
case 1:
GpioDataRegs.GPFDAT.bit.GPIOF10 = 1; // setb BC_DAT.
break;
}
}
// BC_DAT = P26 = GPIOF10
unsigned char read_BC_DAT(void)
{
EALLOW;
GpioMuxRegs.GPFDIR.bit.GPIOF10 = 0; //dat 口设置成输入
EDIS;
switch(GpioDataRegs.GPFDAT.bit.GPIOF10)
{
case 0:
return 0x00; // read, BC_DAT=0.
case 1:
return 0x01; // read, BC_DAT=1.
}
return 0xff;
}
// BC_KEY = P28 = GPIOF8
void set_BC_KEY(int state)
{
EALLOW;
GpioMuxRegs.GPFDIR.bit.GPIOF8 = 1; //dat 口设置成输出
EDIS;
switch(state)
{
case 0:
GpioDataRegs.GPFDAT.bit.GPIOF8 = 0; // clear BC_KEY.
break;
case 1:
GpioDataRegs.GPFDAT.bit.GPIOF8 = 1; // setb BC_KEY.
break;
}
}
// BC_KEY = P28 = GPIOF8
unsigned char read_BC_KEY(void)
{
EALLOW;
GpioMuxRegs.GPFDIR.bit.GPIOF8 = 0; //dat 口设置成输入
EDIS;
switch(GpioDataRegs.GPFDAT.bit.GPIOF8)
{
case 0:
return 0x00; // read, BC_KEY=0.
case 1:
return 0x01; // read, BC_KEY=1.
}
return 0xff;
}
// BC_CLK = P25 = GPIOF9
void set_BC_CLK(int state)
{
EALLOW;
GpioMuxRegs.GPFDIR.bit.GPIOF9 = 1; //dat 口设置成输出
EDIS;
switch(state)
{
case 0:
GpioDataRegs.GPFDAT.bit.GPIOF9 = 0; // clear BC_CLK.
break;
case 1:
GpioDataRegs.GPFDAT.bit.GPIOF9 = 1; // setb BC_CLK.
break;
}
}
//-----------------------------------------------------下面是BC7281子程序
//----------------------------
向 BC728X 发送一个字节-------------------------
// output parameters: bc7281_send_1_byte() // =0x00, 超时出错。0x01, 成功。
unsigned char bc7281_send_1_byte(unsigned char send_byte,unsigned int
overtime_in_us)
{
unsigned char bit_counter;
gen_timer1_counter_in_us=overtime_in_us;
if(gen_timer1_counter_in_us==0)return 0x00; // 超时出错, 直接返回。
// 直接发一个时钟脉冲。
set_BC_CLK(0);
delay_gen_timer2_in_us(200); // BC7281要求这个时钟脉冲宽度不小于1us. 这里是200us.
set_BC_CLK(1);
// 然后等待BC_DAT变低。
gen_timer2_counter_in_us=5000; //
在F2812向BC7281发出一个时钟脉冲后,用5ms时间来等待BC_DAT变低。如果在5ms内没有变低,则重发一个时钟脉冲。
while(read_BC_DAT()==1) //读取DAT的状态线,当DAT为高时,继续读取状态。
{
if(gen_timer1_counter_in_us==0)return 0x00; // 超时出错, 直接返回。
if(gen_timer2_counter_in_us==0)return 0x00; // 超时出错, 直接返回。
}
// 至此, BC7281已响应. DAT变低, 要再发一个CLK, 等待DAT变高.
set_BC_CLK(0);
delay_gen_timer2_in_us(200); // BC7281要求这个时钟脉冲宽度不小于1us. 这里是200us.
set_BC_CLK(1);
gen_timer2_counter_in_us=5000;
while(read_BC_DAT()==0)
{
if(gen_timer1_counter_in_us==0)return 0x00; // 超时出错, 直接返回。
if(gen_timer2_counter_in_us==0)return 0x00; // 超时出错, 直接返回。
}
// BC_DAT已变高
delay_gen_timer2_in_us(200); // BC7281要求这个时钟脉冲宽度不小于1us. 这里是200us.
// 下面开始发送8个bits.
// 至此, DAT又变高. 可以开始发送8bits.
for (bit_counter = 0; bit_counter < 8; bit_counter++)
{ // 发送 8 个比特
if ((send_byte & 0x80) == 0)
{
set_BC_DAT(0); // 如果待发bit为0, 置 dat 为 0
}
else
{
set_BC_DAT(1); // 反之置为 1
}
send_byte = send_byte << 1; // send_byte 左移一位
set_BC_CLK(0); // 输出一 clk 脉冲
// set_LED0(0);
delay_gen_timer2_in_us(200); // BC7281要求这个时钟脉冲宽度不小于1us. 这里是200us.
set_BC_CLK(1);
// set_LED0(1);
delay_gen_timer2_in_us(200); // BC7281要求这个时钟周期,即0+1的总时长,不小于8us.
这里是共400us.
}
return 0x00; // 已成功发送一个字节。
}
//------------------------------从 BC728X
接收一个字节----------------------------
unsigned char bc7281_receive_1_byte(unsigned int overtime_in_us)
{
unsigned char bit_counter, in_byte;
gen_timer1_counter_in_us=overtime_in_us;
if(gen_timer1_counter_in_us==0)return 0x00; // 超时出错, 直接返回。
// 直接发一个时钟脉冲,请求握手信号。
set_BC_CLK(0);
delay_gen_timer2_in_us(200); // BC7281要求这个时钟脉冲宽度不小于1us. 这里是200us.
set_BC_CLK(1);
while(read_BC_DAT()==1) // 等待DAT响应
{
if(gen_timer1_counter_in_us==0)return 0x00; // 超时出错, 直接返回。
if(gen_timer2_counter_in_us==0)return 0x00; // 超时出错, 直接返回。
}
set_BC_CLK(0);
delay_gen_timer2_in_us(200); // BC7281要求这个时钟脉冲宽度不小于1us. 这里是200us.
set_BC_CLK(1);
for (bit_counter=0;bit_counter<8;bit_counter++)
{ // 接收8个bit
in_byte=in_byte*2; // in_byte 左移一位
if (read_BC_DAT()==1) // 如果 dat 为'1'
{
in_byte=in_byte|0x01; // bit0=1
}
set_BC_CLK(0);
// set_LED1(0);
delay_gen_timer2_in_us(200); // BC7281要求这个时钟脉冲宽度不小于1us. 这里是200us.
set_BC_CLK(1);
// set_LED1(1);
delay_gen_timer2_in_us(200); // 短暂延时
}
return(in_byte);
}
//-----------写入BC728X, 第一个参数为目标寄存器地址, 第二个参数为要写入的数据
---------------
void write7281(unsigned char reg_add, unsigned char write_data)
{
bc7281_send_1_byte(reg_add,3000); // 发送寄存器地址
delay_gen_timer2_in_us(100);
bc7281_send_1_byte(write_data,3000); // 发送数据字节
}
//------------读出 BC728X 内部寄存器的值,
调用参数为寄存器地址--------------------
unsigned char read7281(unsigned char reg_add)
{
bc7281_send_1_byte(reg_add|0x80,3000); // 发送读指令(bit7=1)
return(bc7281_receive_1_byte(3000)); // 接收数据字节并返回
}
//------------------------------------------------------------------
//-----------------------------调试BC7281程
序--------------------------------
void debug_bc7281()
{
unsigned char key_number;
write7281(0x12,0x81); // initialize BC7281. 采用74HC595.
write7281(0x15,0x00); // display '0' at postion 0.
write7281(0x15,0x10); // display '0' at postion 0.
write7281(0x15,0x26); // display '0' at postion 0.
write7281(0x15,0x35); // display '0' at postion 0.
write7281(0x15,0x44); // display '0' at postion 0.
write7281(0x15,0x53); // display '0' at postion 0.
write7281(0x15,0x62); // display '0' at postion 0.
write7281(0x15,0x71); // display '0' at postion 0.
while(1)
{
delay_gen_timer4_in_ms(50);
if(read_BC_KEY()==0) // 等待按键
{
key_number=read7281(0x13);
key_number = key_number & 0x00ff;
switch(key_number)
{
case 0x00:
key_number=0x01;
break;
case 0x01:
key_number=0x04;
break;
case 0x02:
key_number=0x07;
break;
case 0x03:
key_number=0x0a;
break;
case 0x08:
key_number=0x02;
break;
case 0x09:
key_number=0x05;
break;
case 0x0a:
key_number=0x08;
break;
case 0x0b:
key_number=0x00;
break;
case 0x10:
key_number=0x03;
break;
case 0x11:
key_number=0x06;
break;
case 0x12:
key_number=0x09;
break;
case 0x13:
key_number=0x0b;
break;
case 0x18:
key_number=0x0c;
break;
case 0x19:
key_number=0x0d;
break;
case 0x1a:
key_number=0x0e;
break;
case 0x1b:
key_number=0x0f;
break;
case 0x20:
key_number=0x1a;
break;
case 0x21:
key_number=0x1b;
break;
case 0x22:
key_number=0x1c;
break;
case 0x23:
key_number=0x1d;
break;
case 0x28:
key_number=0x1e;
break;
case 0x29:
key_number=0x1f;
break;
case 0x2a:
key_number=0x2a;
break;
case 0x2b:
key_number=0x2b;
break;
}
write7281(0x15,0x10+(key_number&0xf0)/16); // 在第1位上以HEX译码方式显示键码的高4位
write7281(0x15,key_number&0x0f); // 在第0位上以HEX译码方式显示键码的低4位
}
}
}
|