捌:模擬SPI總線,實現CS1180AD轉換

模擬spi總線操作ad轉換芯片cs1180,實現電壓、電流表,以下為CODE

cs1180.c-模式轉換芯片驅動

/******************************************
*MCU:stc15wk32s4
*AUTHOR:Golf
******************************************/
#include <stdio.h>
#include "CS1180.h"
#include "Usart_Init.h"

//寄存器地址定義
#define SETUP 0X00//PGA 及BO//cs 控制
#define MUX   0X01//輸入通道選擇
#define ACR   0X02//模擬電路控制
#define ODAC  0X03//Offset DAC 設置
#define DIO   0X04//數字I/O 引腳設置
#define DIR   0X05//輸入輸出的方向選擇
#define IOCON 0X06//I/O 配置寄存器
#define OCC0  0X07//失調誤差正系數
#define OCC1  0X08//失調誤差正系數
#define OCC2  0X09//失調誤差正系數
#define GCC0  0X0A//增益誤差校正系數
#define GCC1  0X0B//增益誤差校正系數
#define GCC2  0X0C//增益誤差校正系數
#define DOR2  0X0D//模數轉換數據高8位
#define DOR1  0X0E//模數轉換數據中8位
#define DOR0  0X0F//模數轉換數據低8位 

//命令定義
#define RDATA    0X01//從DOR 寄存器中讀取數據
#define RDATAC   0X03//從DOR 寄存器中連續讀取數據
#define STOPC    0X0F//停止從DOR 寄存器中連續讀取數據
#define RREG     0X10//低4位為寄存器地址
#define WREG     0X50//低4位為寄存器地址
#define CALSELF  0XF0//對芯片的失調誤差和增益誤差進行糾正
#define OCALSELF 0XF1//對芯片的失調誤差進行糾正
#define GCALSELF 0XF2//對芯片的增益誤差進行糾正
#define OCALSYS  0XF3//對系統的失調誤差進行糾正
#define GCALSYS  0XF4//對系統的增益誤差進行糾正
#define WAKEUP   0XFB//將系統從睡眠模式模式中喚醒
#define SYNC     0XFC//對DRDY 進行同步
#define SLEEP    0XFD//使芯片進入睡眠模式
#define RESET    0XFE//將芯片復位到上電后的狀態
#define P_ADD    0XA3//將芯片復位到上電后的狀態

//IO口定義
#define DRDY2 P32
#define DRDY1 P33
#define SCK P34
#define SDO P35
#define SDI P36
#define CS1_A P37
#define CS2_V P20

xdata adi ad_d[2];
bit ad_a_ok,ad_v_ok;//ADC轉換完標志
    
/*寫一個字節的數據到CS1180的SDI引腳*/
void Write_One_Byte(unsigned char Byte)    
{
    char i=0;
    for(;i<8;i++)
    {
        SDI = (bit)(Byte&(0x80>>i));           //先傳高位  
        SCK = 0;                               //寫數據的時候,數據在上升沿被寫入   
        SCK = 1;
    }
}

/*從SDO引腳讀取一個字節的數據*/
unsigned char Read_One_Byte(void)       
{
    char i=0;
    unsigned char Data = 0;
    for(;i<8;i++)
    {
        SCK = 1;                               //讀數據的時候,數據在下降沿被輸出
        SCK = 0;
        Data = (Data << 1) | SDO;
    }
    SCK = 1;
    return Data;
}

/*1:讀取ADC數據 命令編碼:0x01*/
unsigned long Read_Adc_Data(void)
{
    char datah;
    unsigned char datam,datal;
    signed long c=0;
    datal=datam=datah=0;
    Write_One_Byte(0x01);         //寫入命令:0x01 寫完后SCK=1 
    datah=Read_One_Byte();
    datam=Read_One_Byte();
    datal=Read_One_Byte();
    c=datah<<16|datam<<8|datal;
    return(c);
}

/*2:讀取寄存器的值 命令編碼:0001 rrrr xxxx nnnn*/
void Read_Reg_Data(char start_reg_addr,char num,char *ptr)
{
    Write_One_Byte(0x10|start_reg_addr);  //命令的第一個字節    
    Write_One_Byte(num-1);
    for(;num!=0;num--)
    {
        *(ptr++) = Read_One_Byte();           //將讀取的寄存器的值順序保存在數組中 
    }
}

/*3:寫數據到控制寄存器中 命令編碼:0101 rrrr xxxx nnnn*/
unsigned char Write_Reg_Data(char start_reg_addr,char reg_data)
{
    char err_num = 0;
    Write_One_Byte(0x50|start_reg_addr);  //命令的第一個字節,第一個寄存器為0x00   
    Write_One_Byte(0x00);                 //命令的第二個字節,總共寫1個寄存器   
    Write_One_Byte(reg_data);             //寫入第一個寄存器值  
    return 0;
}

//4:CS1180初始化函數 
void CS1180_ADC_Init(void)
{
    //全部為準雙向口
    P3M0=0;
    P3M1=0;
    P2M0&=~0x01;
    P2M1&=~0x01;
    
    //初始化電流ADC 
    CS1_A = 0;             
    Write_One_Byte(RESET);    
    Write_Reg_Data(SETUP,0x02);
    Write_Reg_Data(ACR,0x62);
    Write_Reg_Data(ODAC,0x30);
    CS1_A = 1; 

    //初始化電壓ADC 
    CS2_V = 0;              
    Write_One_Byte(RESET);   
    Write_Reg_Data(ACR,0x62);
    Write_Reg_Data(ODAC,0x30); 
    CS2_V = 1; 
    
    //外部中斷初始化
    IT0=1;//下降沿觸發
    EX0=1;//開中斷
    IT1=1;//下降沿觸發
    EX1=1;//開中斷
}

/*外部中斷0響應函數 讀取電壓*/
void Int0_func() interrupt 0
{
    EX1 = 0;    //關掉電流表中斷  
    if(DRDY2==0)
    {
        LED1 = 0;
        CS2_V = 0;
        ad_d[1].ad_re = Read_Adc_Data();
        CS2_V = 1;
        IE0 = 0;       //外部中斷標志位清0
        ad_a_ok = 1;
        LED1 = 1;
    }
    EX1=1;
} 

/*外部中斷1響應函數 讀取電流*/
void Int1_func() interrupt 2
{
    EX0 = 0;    //關掉電壓表中斷  
    if(DRDY1==0)
    {
        LED2 = 0;
        CS1_A = 0;
        ad_d[0].ad_re = Read_Adc_Data();
        CS1_A = 1;
        IE1 = 0;        //外部中斷標志位清0
        ad_v_ok = 1;
        LED2 = 1;
    }
    EX0 = 1;
} 


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容