pcf8951 ad/da(iic)转换模块 在 esp8266下的实现
生活随笔
收集整理的這篇文章主要介紹了
pcf8951 ad/da(iic)转换模块 在 esp8266下的实现
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
adc.h
#ifndef __ADC_H__
#define __ADC_H__
#include "Gpio.h"//GPIO頭文件
#include "ets_sys.h"
#include "osapi.h"
#include "user_interface.h"
#include "user_devicefind.h"
#include "user_webserver.h"
#include "driver/gpio16.h"//GPIO16頭文件
#include "Gpio.h"//GPIO頭文件
#define SDAPIN? GPIO_ID_PIN(14)
#define SCLPIN? GPIO_ID_PIN(12)
#define SCLNAME? PERIPHS_IO_MUX_MTDI_U
#define SDANAME PERIPHS_IO_MUX_MTMS_U
#define SDAL GPIO_OUTPUT_SET(SDAPIN,0)
#define SCLL? GPIO_OUTPUT_SET(SCLPIN,0)
#define SDAH GPIO_OUTPUT_SET(SDAPIN,1)
#define SCLH? GPIO_OUTPUT_SET(SCLPIN,1)
#define SDAR? GPIO_INPUT_GET(SDAPIN)
void IICio_init();
//引腳初始化
?void Start_I2c();
//結(jié)束總線函數(shù)??
?void Stop_I2c();
//應(yīng)答子函數(shù)
?void Ack_I2c(char a);
//字節(jié)數(shù)據(jù)發(fā)送函數(shù)
?void? SendByte(unsigned char? c);
//有子地址發(fā)送多字節(jié)數(shù)據(jù)函數(shù)???????????????
?char ISendStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no) ;
//無子地址發(fā)送多字節(jié)數(shù)據(jù)函數(shù)???
?char ISendStrExt(unsigned char sla,unsigned char *s,unsigned char no);
//無子地址讀字節(jié)數(shù)據(jù)函數(shù)???????????????
?unsigned char RcvByte();
char DACconversion(unsigned char sla,unsigned char c,? unsigned char Val);
#endif
adc.c
#include"adc.h"
#define NOP os_delay_us
char ack=1;???????????????? /*應(yīng)答標志位*/
void IICio_init()
{
??PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U,FUNC_GPIO12);//SCL
?PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U,FUNC_GPIO14);//SDA
}
/**************************************************
?????????????? 開始信號
? ************************************************/
void Start_I2c()
{
?SDAH;
?NOP(1);
?SCLH;
?NOP(5);
?SDAL;
?NOP(5);
?SCLL;
?NOP(2);
}
/**************************************************
????????????? 結(jié)束信號
? ************************************************/
void Stop_I2c()
{
?SDAL;
?NOP(1);
?SCLH;
?NOP(5);
?SDAH;
?NOP(4);
}
/*******************************************************************
???????????????? 字節(jié)數(shù)據(jù)發(fā)送函數(shù)???????????????
函數(shù)原型: void? SendByte(UCHAR c);
功能:???? 將數(shù)據(jù)c發(fā)送出去,可以是地址,也可以是數(shù)據(jù),發(fā)完后等待應(yīng)答,并對
????????? 此狀態(tài)位進行操作.(不應(yīng)答或非應(yīng)答都使ack=0)?????
?????????? 發(fā)送數(shù)據(jù)正常,ack=1; ack=0表示被控器無應(yīng)答或損壞。
********************************************************************/
void? SendByte(unsigned char? c)
{
???? unsigned char? BitCnt;
SCLL;?
??
?for(BitCnt=0;BitCnt<8;BitCnt++)? /*要傳送的數(shù)據(jù)長度為8位*/
??? {
???? if((c<<BitCnt)&0x80) SDAH;?? /*判斷發(fā)送位*/
?????? else? SDAL;????????????????
???? NOP(5);
???? SCLH;?????????????? /*置時鐘線為高,通知被控器開始接收數(shù)據(jù)位*/
????? NOP(5);???????????? /*保證時鐘高電平周期大于4μs*/???
???? SCLL;?
? NOP(10);??
??? }
NOP(3);
??? SDAH;??????????????? /*8位發(fā)送完后釋放數(shù)據(jù)線,準備接收應(yīng)答位*/
??? NOP(2);???
??? SCLH;
??? NOP(7);
??? if(SDAR == 0) ack=1;?????
?????? else ack=0;??????? /*判斷是否接收到應(yīng)答信號*/
??? SCLL;
??? NOP(2);
?
}
/*******************************************************************
???????????????? 字節(jié)數(shù)據(jù)接收函數(shù)???????????????
函數(shù)原型: UCHAR? RcvByte();
功能:??????? 用來接收從器件傳來的數(shù)據(jù),并判斷總線錯誤(不發(fā)應(yīng)答信號),
????????? 發(fā)完后請用應(yīng)答函數(shù)應(yīng)答從機。??
********************************************************************/????
unsigned char?? RcvByte()
{
? unsigned char? retc;
? unsigned char? BitCnt;
??
? retc=0;?
? SDAH;???????????????????? /*置數(shù)據(jù)線為輸入方式*/
? for(BitCnt=0;BitCnt<8;BitCnt++)
????? {
??????? NOP(1);???????????
??????? SCLL;????????????????? /*置時鐘線為低,準備接收數(shù)據(jù)位*/
??????? NOP(5);
??????? SCLH;????????????????? /*置時鐘線為高使數(shù)據(jù)線上數(shù)據(jù)有效*/
??????? NOP(2);
??????? retc=retc<<1;
??????? if(SDAR != 0) retc=retc+1;? /*讀數(shù)據(jù)位,接收的數(shù)據(jù)位放入retc中 */
??????? NOP(2);
????? }
? SCLL;????
? NOP(2);
? return(retc);
}
/********************************************************************
???????????????????? 應(yīng)答子函數(shù)
函數(shù)原型:? void Ack_I2c(bit a);
功能:????? 主控器進行應(yīng)答信號(可以是應(yīng)答或非應(yīng)答信號,由位參數(shù)a決定)
********************************************************************/
void Ack_I2c(char a)
{
??
? if(a==0) SDAL;????????????? /*在此發(fā)出應(yīng)答或非應(yīng)答信號 */
? else SDAH;
? NOP(3);?????
? SCLH;
? NOP(5);??????????????????? /*時鐘低電平周期大于4μs*/
? SCLL;???????????????????? /*清時鐘線,鉗住I2C總線以便繼續(xù)接收*/
? NOP(2);???
}
/*******************************************************************
DAC 變換, 轉(zhuǎn)化函數(shù)???????????????
*******************************************************************/
char DACconversion(unsigned char sla,unsigned char c,? unsigned char Val)
{
? Start_I2c();????????????? //啟動總線
?? SendByte(sla);??????????? //發(fā)送器件地址
?? if(ack==0)return(0);
?? SendByte(c);????????????? //發(fā)送控制字節(jié)
?? if(ack==0)return(0);
?? SendByte(Val);??????????? //發(fā)送DAC的數(shù)值??
?? if(ack==0)return(0);
?? Stop_I2c();?????????????? //結(jié)束總線
?? return(1);
}
/*******************************************************************
ADC發(fā)送字節(jié)[命令]數(shù)據(jù)函數(shù)???????????????
*******************************************************************/
char ISendByte(unsigned char sla,unsigned char c)
{
?
?? Start_I2c();????????????? //啟動總線
?? SendByte(sla);??????????? //發(fā)送器件地址
?? if(ack==0)return(0);
?? GPIO_OUTPUT_SET(GPIO_ID_PIN(13), 1);
?? SendByte(c);????????????? //發(fā)送數(shù)據(jù)
?? if(ack==0)return(0);
?? Stop_I2c();?????????????? //結(jié)束總線
?? ?GPIO_OUTPUT_SET(GPIO_ID_PIN(13), 0);
?? return(1);
}
/*******************************************************************
ADC讀字節(jié)數(shù)據(jù)函數(shù)???????????????
*******************************************************************/
unsigned char IRcvByte(unsigned char sla)
{? unsigned char c;
Start_I2c();????????? //啟動總線
?? SendByte(sla+1);????? //發(fā)送器件地址
?? if(ack==0)return(0);
?? c=RcvByte();????????? //讀取數(shù)據(jù)0
Ack_I2c(1);?????????? //發(fā)送非就答位
?? Stop_I2c();?????????? //結(jié)束總線
?? return(c);
}
#define __ADC_H__
#include "Gpio.h"//GPIO頭文件
#include "ets_sys.h"
#include "osapi.h"
#include "user_interface.h"
#include "user_devicefind.h"
#include "user_webserver.h"
#include "driver/gpio16.h"//GPIO16頭文件
#include "Gpio.h"//GPIO頭文件
#define SDAPIN? GPIO_ID_PIN(14)
#define SCLPIN? GPIO_ID_PIN(12)
#define SCLNAME? PERIPHS_IO_MUX_MTDI_U
#define SDANAME PERIPHS_IO_MUX_MTMS_U
#define SDAL GPIO_OUTPUT_SET(SDAPIN,0)
#define SCLL? GPIO_OUTPUT_SET(SCLPIN,0)
#define SDAH GPIO_OUTPUT_SET(SDAPIN,1)
#define SCLH? GPIO_OUTPUT_SET(SCLPIN,1)
#define SDAR? GPIO_INPUT_GET(SDAPIN)
void IICio_init();
//引腳初始化
?void Start_I2c();
//結(jié)束總線函數(shù)??
?void Stop_I2c();
//應(yīng)答子函數(shù)
?void Ack_I2c(char a);
//字節(jié)數(shù)據(jù)發(fā)送函數(shù)
?void? SendByte(unsigned char? c);
//有子地址發(fā)送多字節(jié)數(shù)據(jù)函數(shù)???????????????
?char ISendStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no) ;
//無子地址發(fā)送多字節(jié)數(shù)據(jù)函數(shù)???
?char ISendStrExt(unsigned char sla,unsigned char *s,unsigned char no);
//無子地址讀字節(jié)數(shù)據(jù)函數(shù)???????????????
?unsigned char RcvByte();
char DACconversion(unsigned char sla,unsigned char c,? unsigned char Val);
#endif
adc.c
#include"adc.h"
#define NOP os_delay_us
char ack=1;???????????????? /*應(yīng)答標志位*/
void IICio_init()
{
??PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U,FUNC_GPIO12);//SCL
?PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U,FUNC_GPIO14);//SDA
}
/**************************************************
?????????????? 開始信號
? ************************************************/
void Start_I2c()
{
?SDAH;
?NOP(1);
?SCLH;
?NOP(5);
?SDAL;
?NOP(5);
?SCLL;
?NOP(2);
}
/**************************************************
????????????? 結(jié)束信號
? ************************************************/
void Stop_I2c()
{
?SDAL;
?NOP(1);
?SCLH;
?NOP(5);
?SDAH;
?NOP(4);
}
/*******************************************************************
???????????????? 字節(jié)數(shù)據(jù)發(fā)送函數(shù)???????????????
函數(shù)原型: void? SendByte(UCHAR c);
功能:???? 將數(shù)據(jù)c發(fā)送出去,可以是地址,也可以是數(shù)據(jù),發(fā)完后等待應(yīng)答,并對
????????? 此狀態(tài)位進行操作.(不應(yīng)答或非應(yīng)答都使ack=0)?????
?????????? 發(fā)送數(shù)據(jù)正常,ack=1; ack=0表示被控器無應(yīng)答或損壞。
********************************************************************/
void? SendByte(unsigned char? c)
{
???? unsigned char? BitCnt;
SCLL;?
??
?for(BitCnt=0;BitCnt<8;BitCnt++)? /*要傳送的數(shù)據(jù)長度為8位*/
??? {
???? if((c<<BitCnt)&0x80) SDAH;?? /*判斷發(fā)送位*/
?????? else? SDAL;????????????????
???? NOP(5);
???? SCLH;?????????????? /*置時鐘線為高,通知被控器開始接收數(shù)據(jù)位*/
????? NOP(5);???????????? /*保證時鐘高電平周期大于4μs*/???
???? SCLL;?
? NOP(10);??
??? }
NOP(3);
??? SDAH;??????????????? /*8位發(fā)送完后釋放數(shù)據(jù)線,準備接收應(yīng)答位*/
??? NOP(2);???
??? SCLH;
??? NOP(7);
??? if(SDAR == 0) ack=1;?????
?????? else ack=0;??????? /*判斷是否接收到應(yīng)答信號*/
??? SCLL;
??? NOP(2);
?
}
/*******************************************************************
???????????????? 字節(jié)數(shù)據(jù)接收函數(shù)???????????????
函數(shù)原型: UCHAR? RcvByte();
功能:??????? 用來接收從器件傳來的數(shù)據(jù),并判斷總線錯誤(不發(fā)應(yīng)答信號),
????????? 發(fā)完后請用應(yīng)答函數(shù)應(yīng)答從機。??
********************************************************************/????
unsigned char?? RcvByte()
{
? unsigned char? retc;
? unsigned char? BitCnt;
??
? retc=0;?
? SDAH;???????????????????? /*置數(shù)據(jù)線為輸入方式*/
? for(BitCnt=0;BitCnt<8;BitCnt++)
????? {
??????? NOP(1);???????????
??????? SCLL;????????????????? /*置時鐘線為低,準備接收數(shù)據(jù)位*/
??????? NOP(5);
??????? SCLH;????????????????? /*置時鐘線為高使數(shù)據(jù)線上數(shù)據(jù)有效*/
??????? NOP(2);
??????? retc=retc<<1;
??????? if(SDAR != 0) retc=retc+1;? /*讀數(shù)據(jù)位,接收的數(shù)據(jù)位放入retc中 */
??????? NOP(2);
????? }
? SCLL;????
? NOP(2);
? return(retc);
}
/********************************************************************
???????????????????? 應(yīng)答子函數(shù)
函數(shù)原型:? void Ack_I2c(bit a);
功能:????? 主控器進行應(yīng)答信號(可以是應(yīng)答或非應(yīng)答信號,由位參數(shù)a決定)
********************************************************************/
void Ack_I2c(char a)
{
??
? if(a==0) SDAL;????????????? /*在此發(fā)出應(yīng)答或非應(yīng)答信號 */
? else SDAH;
? NOP(3);?????
? SCLH;
? NOP(5);??????????????????? /*時鐘低電平周期大于4μs*/
? SCLL;???????????????????? /*清時鐘線,鉗住I2C總線以便繼續(xù)接收*/
? NOP(2);???
}
/*******************************************************************
DAC 變換, 轉(zhuǎn)化函數(shù)???????????????
*******************************************************************/
char DACconversion(unsigned char sla,unsigned char c,? unsigned char Val)
{
? Start_I2c();????????????? //啟動總線
?? SendByte(sla);??????????? //發(fā)送器件地址
?? if(ack==0)return(0);
?? SendByte(c);????????????? //發(fā)送控制字節(jié)
?? if(ack==0)return(0);
?? SendByte(Val);??????????? //發(fā)送DAC的數(shù)值??
?? if(ack==0)return(0);
?? Stop_I2c();?????????????? //結(jié)束總線
?? return(1);
}
/*******************************************************************
ADC發(fā)送字節(jié)[命令]數(shù)據(jù)函數(shù)???????????????
*******************************************************************/
char ISendByte(unsigned char sla,unsigned char c)
{
?
?? Start_I2c();????????????? //啟動總線
?? SendByte(sla);??????????? //發(fā)送器件地址
?? if(ack==0)return(0);
?? GPIO_OUTPUT_SET(GPIO_ID_PIN(13), 1);
?? SendByte(c);????????????? //發(fā)送數(shù)據(jù)
?? if(ack==0)return(0);
?? Stop_I2c();?????????????? //結(jié)束總線
?? ?GPIO_OUTPUT_SET(GPIO_ID_PIN(13), 0);
?? return(1);
}
/*******************************************************************
ADC讀字節(jié)數(shù)據(jù)函數(shù)???????????????
*******************************************************************/
unsigned char IRcvByte(unsigned char sla)
{? unsigned char c;
Start_I2c();????????? //啟動總線
?? SendByte(sla+1);????? //發(fā)送器件地址
?? if(ack==0)return(0);
?? c=RcvByte();????????? //讀取數(shù)據(jù)0
Ack_I2c(1);?????????? //發(fā)送非就答位
?? Stop_I2c();?????????? //結(jié)束總線
?? return(c);
}
總結(jié)
以上是生活随笔為你收集整理的pcf8951 ad/da(iic)转换模块 在 esp8266下的实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ESP8266-SDK的硬件定时器
- 下一篇: ESP8266擦除flash