标题:
MSP430单片机+BS8112A-3程序源码
[打印本页]
作者:
zqt8585
时间:
2019-10-14 08:22
标题:
MSP430单片机+BS8112A-3程序源码
采用仿II2C通讯,该芯片II2C通讯略有区别,已调试通过,仅供参考
单片机源程序如下:
//==============================================================================
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
// 文 件 名 : keyboard.c
// 版 本 号 :
// 作 者 :
// 生成日期 :
// 最近修改 :
// 功能描述 : FPC触摸按键 IIC 接口例程(MSP430F149系列)
// 驱动IC : BS8112A-3
// 说明: 硬件说明
// ----------------------------------------------------------------
// GND 电源地
// VCC 接3.3v电源
// SCL IIC时钟信号线
// SDA IIC数据线
// IRQ 中断请求
// ----------------------------------------------------------------
// 说明:软件说明-IIC时序
// -------------------------------------------------------------------
// 1,该芯片IIC驱动时序有点特殊,该芯片是不回ACK的,需要主设备发出,实际主设备发9位,见使用手册7位地址+1位读写位+1位ACK
// 2, 主机发完后,需要等待从设备处理完成,根据实际需求在发送ACK时增加几个延时也可以,本代码没加,从波形看也没问题
// ------------------------------------------------------------------
// 修改历史 :
// 日 期 :
// 修改内容 : 创建文件
//==================================================================================
#include <msp430F249.h>
#include "Keyboard.h"
#include "timer.h"
#define Key_BS8112_IIC
#define BS8112_DELAY {delay_us(10);}
//==============================================================
// Function Name: void BS8112_IO_Init(void)
// Parameters: none
// Return value: none
// Description: this function is used to generate IIC start signal
// Tips:IIC数据有效性,在时钟高电平周期内,数据必须保持稳定
// GND 电源地
// VCC 接3.3v电源
// SCL P16(时钟)
// SDA P15(数据)
// IRQ P17 中断请求
//============================================================
void BS8112_IO_Init(void)
{
P1DIR |= BS8112_SCL+BS8112_SDA; //1输出,0输入
P1OUT &= ~(BS8112_SCL+BS8112_SDA); //初始化为输出值为0
P1DIR &=~BS8112_IRQ; //0输入
}
//==============================================================
// Function Name: void I2CStart(void)
// Parameters: none
// Return value: none
// Description: this function is used to generate IIC start signal
// Tips:IIC数据有效性,在时钟高电平周期内,数据必须保持稳定
// 数据线信号仅在时钟电平为低时改变
// iic的起始:在SCL为高时,SDA由高变低,为起始条件
// 时序 CLK 0 delay 1 delay 0 为一个周期,在高电平时数据有效必须稳定,只能在低电平时可以改变数据值
//============================================================
void BS8112_I2CStart(void)
{
BS8112_I2C_SDA_OUT();
BS8112_I2C_SDA_HIGH; // SDA=1
BS8112_I2C_SCL_HIGH; // SCL=1
BS8112_DELAY; //delay
BS8112_I2C_SDA_LOW; //SDA= 0
BS8112_DELAY; //delay
BS8112_I2C_SCL_LOW; // SCL=0
BS8112_DELAY; //delay
}
//==============================================================
// Function Name: void I2CStop(void)
// Parameters: none
// Return value: none
// Description: this function is used to generate IIC stop signal
// Tips:SCL为高时,SDA由低变高跳变,为终止条件
// 时序 CLK 0 delay 1 delay 0 为一个周期,在高电平时数据有效必须稳定,只能在低电平时可以改变数据值
//============================================================
void BS8112_I2CStop(void)
{
BS8112_I2C_SDA_LOW; // SDA=0
BS8112_I2C_SCL_HIGH; // SCL=1
BS8112_DELAY;//delay
BS8112_I2C_SDA_HIGH; // SDA=1
BS8112_DELAY;//delay
}
//==============================================================
// Function Name: void BS8112_I2CAck(void)
// Parameters: none
// Return value: none
// Description: this function is used to generate IIC ACK signal
// Tips:不管主机还是从机,接收到数据后(数据或地址),都有回应一个ACK 信号
// 成功接收回应0
// 时序 CLK 0 delay 1 delay 0 为一个周期,在高电平时数据有效必须稳定,只能在低电平时可以改变数据值
//============================================================
void BS8112_I2CAck(void)
{
BS8112_I2C_SCL_LOW; // SCL=0
BS8112_I2C_SDA_LOW; // SDA=0
BS8112_DELAY; //delay
BS8112_I2C_SCL_HIGH; // SCL=1
BS8112_DELAY; //delay
BS8112_I2C_SCL_LOW; // SCL=0
}
//==============================================================
// Function Name: void BS8112_IIC_NAck(void)
// Parameters: none
// Return value: none
// Description: this function is used to generate IIC ACK signal
// Tips:不管主机还是从机,接收到数据后(数据或地址),都有回应一个ACK 信号
// 接收不成功回应1
// 时序 CLK 0 delay 1 delay 0 为一个周期,在高电平时数据有效必须稳定,只能在低电平时可以改变数据值
//============================================================
void BS8112_I2CNoAck(void)
{
BS8112_I2C_SCL_LOW; // SCL=0, 此句可以不要,因为本身就是0,写上是为了更明确IIC通讯
BS8112_I2C_SDA_HIGH; // SDA=1
BS8112_DELAY; //delay
BS8112_I2C_SCL_HIGH; // SCL=1
BS8112_DELAY; //delay
BS8112_I2C_SCL_LOW; // SCL=0
}
//==============================================================
// Function Name:unsigned char BS8112_I2CRcvAck(void)
// Parameters: none
// Return value: none
// Description: this function is used to wait ACK signal
// Tips: 1: indicate receive failure if the ACK signal is 1
// 0: indicate receive success if the ACK signal is 0
// 时序 CLK 0 delay 1 delay 0 为一个周期,在高电平时数据有效必须稳定,只能在低电平时可以改变数据值
//============================================================
unsigned char BS8112_I2CRcvAck(void)
{
unsigned int delay=0;
BS8112_I2C_SDA_IN();
BS8112_I2C_SCL_LOW; //SCL=0
BS8112_I2C_SDA_HIGH; //SDA
BS8112_DELAY; //delay
BS8112_I2C_SCL_HIGH; //SCL=1
BS8112_DELAY; //delay
while(BS8112_I2C_SDA_GET())
{
delay++;
if(delay>500)
{
BS8112_I2C_SDA_OUT();
BS8112_I2CStop();
return 1;
}
}
BS8112_I2C_SCL_LOW; //SCL=0
BS8112_I2C_SDA_OUT();
return 0;
}
//==============================================================
// Function Name: void BS8112_IIC_Send_Byte(u8 txd)
// Parameters: none
// Return value: none
// Description: this function is used to send a byte
// Tips:
// 时序 CLK 0 delay 1 delay 0 为一个周期,在高电平时数据有效必须稳定,只能在低电平时可以改变数据值
//============================================================
void BS8112_I2CSendByte(unsigned char data)
{
unsigned char i;
for(i=0; i<8; i++)
{
BS8112_I2C_SCL_LOW; //SCL=0
if(data&0x80)
{
BS8112_I2C_SDA_HIGH; //SDA
}
else
{
BS8112_I2C_SDA_LOW; //SDA
}
BS8112_DELAY; //delay
BS8112_I2C_SCL_HIGH; //SCL=1
BS8112_DELAY; //delay
data <<= 1;
}
}
//==============================================================
// Function Name:unsigned char BS8112_I2CReceiveByte(void)
// Parameters:
// Return value: none
// Description: this function is used to receive a byte
// Tips:
// 时序 CLK 0 delay 1 delay 0 为一个周期,在高电平时数据有效必须稳定,只能在低电平时可以改变数据值
//============================================================
unsigned char BS8112_I2CReceiveByte(void)
{
unsigned char re_data;
int i;
re_data = 0;
BS8112_I2C_SDA_IN(); //设置输入
BS8112_DELAY; //delay
for(i=0; i<8; i++)
{
re_data <<= 1;
BS8112_I2C_SCL_LOW; //SCL=0
BS8112_DELAY; //delay
BS8112_I2C_SCL_HIGH; //SCL=1
BS8112_DELAY; //delay
if(BS8112_I2C_SDA_GET())
re_data |= 0x01;
}
BS8112_I2C_SCL_LOW;
BS8112_I2C_SDA_OUT(); //接收完置成输出
return re_data;
}
#define BS8112_DRIVERS
//==============================================================
// Function Name:void BS8112_I2CReceiveByte(unsigned char temp)
// Parameters: none
// Return value: none
// Description: this function is used to receive a byte
// Tips:
//============================================================
unsigned char BS8112_GetSlaveState(void)
{
unsigned int delay=0;
BS8112_I2C_SCL_IN(); //设置时钟信号线输入
while(!BS8112_I2C_SCL_GET()) //等待时钟信号被从设备拉高,继续发送数据
{
delay++;
if(delay>5000)
{
BS8112_I2CStop();
BS8112_I2C_SCL_OUT();
return 0;//忙
}
}
BS8112_I2C_SCL_OUT();
return 1;//空闲
}
//==============================================================
// Function Name:unsigned char BS8112_ReadData(unsigned char addr)
// Parameters: addr:要读取的状态寄存器或控制寄存器的地址
// 0x08: 读取状态寄存器0的数据,包含按键1-按键8的按键的状态
// 0x09: 读取状态寄存器1的数据,包含按键9-按键16的按键的状态
// 0xB0:
// 0XB1:
// ....
// 0XC0:
// Return value: none
// Description: this function is used to get the sate of the REG
// Tips:
// 1,该函数读取触摸按键的状态数据寄存器, 0 表示没有触摸,1表示有触摸
// 2,地址,根据数据手册,给的7位的地址0XA0,实际应该是高7位,故要左移一位
//============================================================
unsigned char BS8112_ReadData(unsigned char addr)
{
unsigned char value=0;
BS8112_I2CStart(); //IIC启动
BS8112_I2CSendByte(0xA0); //地址+写
BS8112_I2CAck(); //发送第9位ACK位,同时增加几个延时,等待从设备处理数据
BS8112_I2CSendByte(addr); //发送寄存器地址
BS8112_I2CAck(); //发送第9位ACK位,同时增加几个延时,等待从设备处理数据
BS8112_I2CStart(); //IIC启动
BS8112_I2CSendByte(0xA1); //地址+读
BS8112_I2CAck(); //发送第9位ACK位,同时增加几个延时,等待从设备处理数据
value=BS8112_I2CReceiveByte();
BS8112_I2CNoAck(); //发送第9位ACK位,同时增加几个延时,等待从设备处理数据
BS8112_I2CStop();
return value;
}
#define BS8112_APP
//==============================================================
// Function Name:unsigned char BS8112_Init(void)
// Parameters: none
// Return value: none
// Description: this function is used to inite the BS8112
// Tips:
// 初始化相关寄存器,共17个寄存器
// 写寄存器通讯结构如下:
// start + slave address +0xB0 + DATA1 +DATA2 + ......+DATA17 +CheckSum
//============================================================
unsigned char BS8112_Init(void)
{
unsigned char data[18]={0x00,0x00,0x83,0xF3,0x98,
//K1, K2, K3, K4, K5,
LOFS,LOFS-2,LOFS-4,LOFS-2,LOFS,
//K6, K7, K8, K9, K10, K11, K12, 校验和
LOFS,LOFS-2,LOFS-4,LOFS-2,LOFS, 63,LOFS|0x40,0x00};
unsigned char i;
unsigned int sum=0;
BS8112_IO_Init();
BS8112_I2CStart(); //IIC启动
BS8112_I2CSendByte(0xA0); //地址+写
BS8112_I2CAck(); //发送第9位ACK位,同时增加几个延时,等待从设备处理数据
BS8112_I2CSendByte(0xB0); //发送寄存器地址
BS8112_I2CAck(); //发送第9位ACK位,同时增加几个延时,等待从设备处理数据
for(i=0;i<17;i++)
{
sum+=data[i];
BS8112_I2CSendByte(data[i]); //发送数8位数据
BS8112_I2CAck(); //发送第9位ACK位,同时增加几个延时,等待从设备处理数据
}
BS8112_I2CSendByte((unsigned char)sum); //发送校验和
BS8112_I2CAck(); //发送第9位ACK位,同时增加几个延时,等待从设备处理数据
BS8112_I2CStop();
return 1;
}
//==============================================================
// Function Name:unsigned char BS8112_GetKeyStateReg(unsigned char dat)
// Parameters: dat:要读取的状态数据的寄存器地址
//
// Return value: none
// Description: this function is used to get the sate of the REG
// Tips:
// 1,该函数读取触摸按键的状态数据寄存器, 0 表示没有触摸,1表示有触摸
// 0x08: 读取状态寄存器0的数据,包含按键1-按键8的按键的状态
// 0x09: 读取状态寄存器1的数据,包含按键9-按键16的按键的状态
//============================================================
unsigned int BS8112_GetKeyValue(void)
{
unsigned int KeyStatus=0;
unsigned int Key_Val_H=0;
unsigned int Key_Val_L=0;
Key_Val_L = BS8112_ReadData(0x08); //按键1-8的状态信息
BS8112_DELAY;
BS8112_DELAY;
Key_Val_H = BS8112_ReadData(0x09); //按键9-16的状态信息
KeyStatus = (Key_Val_H<<8) | Key_Val_L;
return KeyStatus;
}
//==============================================================
// Function Name:unsigned char BS8112_DetectKey(void)
// Parameters:
// Return value: none
// Description: this function is used to get the sate of the REG
// Tips:
// 检测是否有按键按下,正常情况下该脚是NMOS上拉输出高,当有按键时输出低电平
//============================================================
unsigned char BS8112_DetectKey(void)
{
if(!BS8112_DETEC_OUT())//当被拉低时,有按键
{
return 1; //表示检测到按键
}
return 0; //表示没有检测到按键
}
//========================================================================================
复制代码
0.png
(5.48 KB, 下载次数: 77)
下载附件
2019-10-14 15:35 上传
所有资料51hei提供下载:
bs8112a-3.zip
(4.06 KB, 下载次数: 71)
2019-10-14 08:20 上传
点击文件名下载附件
bs8112a-3
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1