|
采用仿II2C通訊,該芯片II2C通訊略有區(qū)別,已調(diào)試通過,僅供參考
單片機(jī)源程序如下:
- //==============================================================================
- //本程序只供學(xué)習(xí)使用,未經(jīng)作者許可,不得用于其它任何用途
- // 文 件 名 : keyboard.c
- // 版 本 號(hào) :
- // 作 者 :
- // 生成日期 :
- // 最近修改 :
- // 功能描述 : FPC觸摸按鍵 IIC 接口例程(MSP430F149系列)
- // 驅(qū)動(dòng)IC : BS8112A-3
- // 說明: 硬件說明
- // ----------------------------------------------------------------
- // GND 電源地
- // VCC 接3.3v電源
- // SCL IIC時(shí)鐘信號(hào)線
- // SDA IIC數(shù)據(jù)線
- // IRQ 中斷請(qǐng)求
- // ----------------------------------------------------------------
- // 說明:軟件說明-IIC時(shí)序
- // -------------------------------------------------------------------
- // 1,該芯片IIC驅(qū)動(dòng)時(shí)序有點(diǎn)特殊,該芯片是不回ACK的,需要主設(shè)備發(fā)出,實(shí)際主設(shè)備發(fā)9位,見使用手冊(cè)7位地址+1位讀寫位+1位ACK
- // 2, 主機(jī)發(fā)完后,需要等待從設(shè)備處理完成,根據(jù)實(shí)際需求在發(fā)送ACK時(shí)增加幾個(gè)延時(shí)也可以,本代碼沒加,從波形看也沒問題
- // ------------------------------------------------------------------
- // 修改歷史 :
- // 日 期 :
- // 修改內(nèi)容 : 創(chuàng)建文件
- //==================================================================================
- #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數(shù)據(jù)有效性,在時(shí)鐘高電平周期內(nèi),數(shù)據(jù)必須保持穩(wěn)定
- // GND 電源地
- // VCC 接3.3v電源
- // SCL P16(時(shí)鐘)
- // SDA P15(數(shù)據(jù))
- // IRQ P17 中斷請(qǐng)求
- //============================================================
- 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數(shù)據(jù)有效性,在時(shí)鐘高電平周期內(nèi),數(shù)據(jù)必須保持穩(wěn)定
- // 數(shù)據(jù)線信號(hào)僅在時(shí)鐘電平為低時(shí)改變
- // iic的起始:在SCL為高時(shí),SDA由高變低,為起始條件
- // 時(shí)序 CLK 0 delay 1 delay 0 為一個(gè)周期,在高電平時(shí)數(shù)據(jù)有效必須穩(wěn)定,只能在低電平時(shí)可以改變數(shù)據(jù)值
- //============================================================
- 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為高時(shí),SDA由低變高跳變,為終止條件
- // 時(shí)序 CLK 0 delay 1 delay 0 為一個(gè)周期,在高電平時(shí)數(shù)據(jù)有效必須穩(wěn)定,只能在低電平時(shí)可以改變數(shù)據(jù)值
- //============================================================
- 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:不管主機(jī)還是從機(jī),接收到數(shù)據(jù)后(數(shù)據(jù)或地址),都有回應(yīng)一個(gè)ACK 信號(hào)
- // 成功接收回應(yīng)0
- // 時(shí)序 CLK 0 delay 1 delay 0 為一個(gè)周期,在高電平時(shí)數(shù)據(jù)有效必須穩(wěn)定,只能在低電平時(shí)可以改變數(shù)據(jù)值
- //============================================================
- 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:不管主機(jī)還是從機(jī),接收到數(shù)據(jù)后(數(shù)據(jù)或地址),都有回應(yīng)一個(gè)ACK 信號(hào)
- // 接收不成功回應(yīng)1
- // 時(shí)序 CLK 0 delay 1 delay 0 為一個(gè)周期,在高電平時(shí)數(shù)據(jù)有效必須穩(wěn)定,只能在低電平時(shí)可以改變數(shù)據(jù)值
- //============================================================
- void BS8112_I2CNoAck(void)
- {
- BS8112_I2C_SCL_LOW; // SCL=0, 此句可以不要,因?yàn)楸旧砭褪?,寫上是為了更明確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
- // 時(shí)序 CLK 0 delay 1 delay 0 為一個(gè)周期,在高電平時(shí)數(shù)據(jù)有效必須穩(wěn)定,只能在低電平時(shí)可以改變數(shù)據(jù)值
- //============================================================
- 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:
- // 時(shí)序 CLK 0 delay 1 delay 0 為一個(gè)周期,在高電平時(shí)數(shù)據(jù)有效必須穩(wěn)定,只能在低電平時(shí)可以改變數(shù)據(jù)值
- //============================================================
- 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:
- // 時(shí)序 CLK 0 delay 1 delay 0 為一個(gè)周期,在高電平時(shí)數(shù)據(jù)有效必須穩(wěn)定,只能在低電平時(shí)可以改變數(shù)據(jù)值
- //============================================================
- unsigned char BS8112_I2CReceiveByte(void)
- {
- unsigned char re_data;
- int i;
- re_data = 0;
- BS8112_I2C_SDA_IN(); //設(shè)置輸入
- 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(); //設(shè)置時(shí)鐘信號(hào)線輸入
- while(!BS8112_I2C_SCL_GET()) //等待時(shí)鐘信號(hào)被從設(shè)備拉高,繼續(xù)發(fā)送數(shù)據(jù)
- {
- 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:要讀取的狀態(tài)寄存器或控制寄存器的地址
- // 0x08: 讀取狀態(tài)寄存器0的數(shù)據(jù),包含按鍵1-按鍵8的按鍵的狀態(tài)
- // 0x09: 讀取狀態(tài)寄存器1的數(shù)據(jù),包含按鍵9-按鍵16的按鍵的狀態(tài)
- // 0xB0:
- // 0XB1:
- // ....
- // 0XC0:
- // Return value: none
- // Description: this function is used to get the sate of the REG
- // Tips:
- // 1,該函數(shù)讀取觸摸按鍵的狀態(tài)數(shù)據(jù)寄存器, 0 表示沒有觸摸,1表示有觸摸
- // 2,地址,根據(jù)數(shù)據(jù)手冊(cè),給的7位的地址0XA0,實(shí)際應(yīng)該是高7位,故要左移一位
- //============================================================
- unsigned char BS8112_ReadData(unsigned char addr)
- {
- unsigned char value=0;
- BS8112_I2CStart(); //IIC啟動(dòng)
- BS8112_I2CSendByte(0xA0); //地址+寫
- BS8112_I2CAck(); //發(fā)送第9位ACK位,同時(shí)增加幾個(gè)延時(shí),等待從設(shè)備處理數(shù)據(jù)
- BS8112_I2CSendByte(addr); //發(fā)送寄存器地址
- BS8112_I2CAck(); //發(fā)送第9位ACK位,同時(shí)增加幾個(gè)延時(shí),等待從設(shè)備處理數(shù)據(jù)
- BS8112_I2CStart(); //IIC啟動(dòng)
- BS8112_I2CSendByte(0xA1); //地址+讀
- BS8112_I2CAck(); //發(fā)送第9位ACK位,同時(shí)增加幾個(gè)延時(shí),等待從設(shè)備處理數(shù)據(jù)
- value=BS8112_I2CReceiveByte();
- BS8112_I2CNoAck(); //發(fā)送第9位ACK位,同時(shí)增加幾個(gè)延時(shí),等待從設(shè)備處理數(shù)據(jù)
- 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:
- // 初始化相關(guān)寄存器,共17個(gè)寄存器
- // 寫寄存器通訊結(jié)構(gòu)如下:
- // 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, 校驗(yàn)和
- 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啟動(dòng)
- BS8112_I2CSendByte(0xA0); //地址+寫
- BS8112_I2CAck(); //發(fā)送第9位ACK位,同時(shí)增加幾個(gè)延時(shí),等待從設(shè)備處理數(shù)據(jù)
-
- BS8112_I2CSendByte(0xB0); //發(fā)送寄存器地址
- BS8112_I2CAck(); //發(fā)送第9位ACK位,同時(shí)增加幾個(gè)延時(shí),等待從設(shè)備處理數(shù)據(jù)
- for(i=0;i<17;i++)
- {
- sum+=data[i];
- BS8112_I2CSendByte(data[i]); //發(fā)送數(shù)8位數(shù)據(jù)
- BS8112_I2CAck(); //發(fā)送第9位ACK位,同時(shí)增加幾個(gè)延時(shí),等待從設(shè)備處理數(shù)據(jù)
- }
- BS8112_I2CSendByte((unsigned char)sum); //發(fā)送校驗(yàn)和
- BS8112_I2CAck(); //發(fā)送第9位ACK位,同時(shí)增加幾個(gè)延時(shí),等待從設(shè)備處理數(shù)據(jù)
- BS8112_I2CStop();
-
- return 1;
- }
- //==============================================================
- // Function Name:unsigned char BS8112_GetKeyStateReg(unsigned char dat)
- // Parameters: dat:要讀取的狀態(tài)數(shù)據(jù)的寄存器地址
- //
- // Return value: none
- // Description: this function is used to get the sate of the REG
- // Tips:
- // 1,該函數(shù)讀取觸摸按鍵的狀態(tài)數(shù)據(jù)寄存器, 0 表示沒有觸摸,1表示有觸摸
- // 0x08: 讀取狀態(tài)寄存器0的數(shù)據(jù),包含按鍵1-按鍵8的按鍵的狀態(tài)
- // 0x09: 讀取狀態(tài)寄存器1的數(shù)據(jù),包含按鍵9-按鍵16的按鍵的狀態(tài)
- //============================================================
- 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的狀態(tài)信息
- BS8112_DELAY;
- BS8112_DELAY;
- Key_Val_H = BS8112_ReadData(0x09); //按鍵9-16的狀態(tài)信息
- 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:
- // 檢測(cè)是否有按鍵按下,正常情況下該腳是NMOS上拉輸出高,當(dāng)有按鍵時(shí)輸出低電平
- //============================================================
- unsigned char BS8112_DetectKey(void)
- {
- if(!BS8112_DETEC_OUT())//當(dāng)被拉低時(shí),有按鍵
- {
- return 1; //表示檢測(cè)到按鍵
- }
- return 0; //表示沒有檢測(cè)到按鍵
- }
- //========================================================================================
復(fù)制代碼
0.png (5.48 KB, 下載次數(shù): 77)
下載附件
2019-10-14 15:35 上傳
所有資料51hei提供下載:
bs8112a-3.zip
(4.06 KB, 下載次數(shù): 71)
2019-10-14 08:20 上傳
點(diǎn)擊文件名下載附件
bs8112a-3 下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|