📄 adt7516.c
字号:
#include "bf5xx.h"
#include "types.h"
#define Iner_Flag_OE 0xff
#define Out_Flag_A 0x00
#define Out_Flag_B 0x00
#define Out_Flag_C 0x00
extern uint8_t databuf[256];
extern uint8_t cmd[2];
/****************************************************************************
* 名称 : ADT7516_SPImode
* 功能 : 软件实现ADT7516进入SPI工作模式
* 入口参数 :无
* 出口参数 :无
****************************************************************************/
void ADT7516_SPImode(void)
{
*pFIO_FLAG_S = PF2; //ADT7516_SPISS 拉高
udelay(0x3ff);
*pFIO_FLAG_C = PF2; //ADT7516_SPISS 拉低
udelay(0x3ff);
*pFIO_FLAG_S = PF2;
udelay(0x3ff);
*pFIO_FLAG_C = PF2;
udelay(0x3ff);
*pFIO_FLAG_S = PF2;
udelay(0x3ff);
*pFIO_FLAG_C = PF2;
udelay(0x3ff);
*pFIO_FLAG_S = PF2;
udelay(0x3ff);
}
/****************************************************************************
* 名称 : ADT7516_SPI_init
* 功能 : ADT7516 SPI 控制器初始化 ,进入主发送模式
* 入口参数 :无
* 出口参数 :无
****************************************************************************/
void ADT7516_SPI_init(void)
{
ADT7516_SPImode(); // 3个脉冲从IIC模式 进入SPI模式
SPIinit();
SPIMenable();
SPIMODE_TX();
}
/****************************************************************************
* 名称 : ADT7516_WRITE_REG
* 功能 : ADT7516 SPI 写控制寄存器函数
* 入口参数 :addr 控制寄存器地址 *buf 要写入的数据 NUM连续写入寄存器数目
* 出口参数 :无
****************************************************************************/
void ADT7516_WRITE_REG(uint8_t addr,uint8_t *buf,uint8_t NUM)
{
SPIMenable(); //允许SPI控制器
SPIMODE_TX(); //SPI 为发送模式
SPIsend(ADT7516_WRITE ); // 写命令
SPIsend(addr); //写地址
if(NUM==2)
{
SPIsend(buf[1]); //GAO
SPIsend(buf[0]); //DI
}
if(NUM==1)
{
SPIsend(buf[0]);//DI
}
udelay(0x3ff);
SPIdisable(); // 禁止SPI 控制器
udelay(0x3ff);
}
/****************************************************************************
* 名称 : ADT7516_READ_REG
* 功能 : ADT7516 SPI 读控制寄存器函数
* 入口参数 :addrr 控制寄存器地址 len 连续读入寄存器数据数目
* 出口参数 :无
****************************************************************************/
void ADT7516_READ_REG(uint8_t addrr,int len)
{
unsigned char i ;
SPIMenable(); // SPI 控制器允许
SPIMODE_TX(); // SPI 为发送模式
SPIsend(ADT7516_WRITE ); //写命令
SPIsend(addrr); //写地址
udelay(0x3ff);
SPIdisable(); //禁止SPI控制器
udelay(0x3ff);
SPIMenable(); // SPI 控制器允许
SPIMODE_TX(); // SPI 为发送模式
SPIsend(ADT7516_READ ); // 写读命令
SPIMODE_RX(); // SPI 为接收模式
if(*pSPI_STAT&RXS) //接收数据
{
databuf[0] = *pSPI_RDBR;
}
for(i=0;i<len;i++)
{
databuf[i] = SPIReadByte();
}
udelay(0x3ff);
udelay(0x3ff);
SPIdisable(); //禁止SPI 控制器
udelay(0x3ff);
}
/****************************************************************************
* 名称 : ADT7516_SPISS_SELECT
* 功能 : 控制CPLD内部 使SPISS 选通 ADT7516_SPISS
* 入口参数 :无
* 出口参数 :无
****************************************************************************/
void ADT7516_SPISS_SELECT(void)
{
*pCtrIner_Flag_OE = (Iner_Flag_OE&&(~SPI_OE)) ; //SPI_switc 允许
mdelay(500);
*pCtrOut_Flag_B = Out_Flag_B; // 选择ADDA_SPISS
mdelay(500);
*pFIO_FLAG_S = PF2;
mdelay(500);
}
/****************************************************************************
* 名称 : ADT7516_SPISS_SELECT
* 功能 : 控制CPLD内部 使SPISS 选通 ADT7516_SPISS
* 入口参数 :无
* 出口参数 :无
****************************************************************************/
void ADT7516_TEST(void)
{
ADT7516_READ_REG(0x7F,1); //读 状态 如果返回为1 则表示进入了SPI模式
udelay(0x3ff);
if(databuf[0]==0x01)
{
printf( "\nThe SPI Lock Status has been entered!\n\r" );
}
ADT7516_READ_REG(0x4D,1); //读 device ID 03
udelay(0x3ff);
if(databuf[0]==0x03)
{
printf( "\nThe Device ID is %d\n\r",databuf[0]);
}
}
/****************************************************************************
* 名称 : ADT7516_CTL
* 功能 : 设置各种控制模式 中断允许 AIN2 选通
* 入口参数 :无
* 出口参数 :无
****************************************************************************/
void ADT7516_CTL(void)
{
//18H Control configure 1
//C0=1 启动监听模式 C1-C2 00 AIN1 AIN2 选通 C3=0 LDAC 选择C4=0 保留
//C5=0 INT 允许 C6=0 低电平中断 C7=0 工作模式
cmd[0] = 0x21;
ADT7516_WRITE_REG(0x18,cmd,1);
//19H Control configure 2
// C2-C0 采样通道选择 011 选择了 AIN2 C3=0 保留 C4=1 单通道周期
cmd[0] = 0x03;
ADT7516_WRITE_REG(0x19,cmd,1);
// 1A H Control configure 3
// C0=0 采样率为1.4K C1=0 DAC 为8位 C2=0 保留 C3=0 LDAC控制输出、
// C4 =0 内部基准电压 C5=0 DAC A 选通 C5=1 输出为内部温度 C6=0 DAC B输出C6=1 输出外部温度
//C7=0 保留
cmd[0] = 0x08;
ADT7516_WRITE_REG(0x1A,cmd,1);
//1B H DAC CONFIGURE
// C0-C3 = 1 DAC 输出电压范围 0-2*VREF 为0 0-VREF
//C5-C4 LDAC 内部控制时更新方式 (此配置为外部控制)
//C6 C7 =0 保留
cmd[0] = 0x00;
ADT7516_WRITE_REG(0x1B,cmd,1);
// 1C H LDAC CONFIGURE
// C0 C1 C2 C3 为1 S时 内部更新DAC A B C D 的输出 (LDAC内部起作用时)
// C4= 1 DAC A B 输出基准电压为内部 为0 时输出为外部
// C5= 1 DAC C D 输出基准电压为内部 为0 时输出为外部
//D6 D7 =0 保留
cmd[0] = 0x30;
ADT7516_WRITE_REG(0x1c,cmd,1);
//1D H INT MASK
// 中断允许控制 为0 允许中断 AIN2 中断允许
cmd[0] = 0xdf;//df;
ADT7516_WRITE_REG(0x1d,cmd,1);
// 1EH INT MASK 2
// C4 允许VDD中断 其他保留
cmd[0] = 0x10;
ADT7516_WRITE_REG(0x1e,cmd,1);
}
/****************************************************************************
* 名称 : ADT7516_RST
* 功能 : ADT7516 软件控制复位
* 入口参数 :无
* 出口参数 :无
****************************************************************************/
void ADT7516_RST(void)
{
cmd[0] = 0x80;
ADT7516_WRITE_REG(0x19,cmd,1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -