初始版本
This commit is contained in:
@@ -0,0 +1,464 @@
|
||||
#include "CS1237_RIGHTUP.h"
|
||||
#include "Debug.h"
|
||||
#include "bsp.h"
|
||||
#include "main.h"
|
||||
#include "Algorithm.h"
|
||||
|
||||
#define CS1237_DOUT_OUT() PORT_OE(RIGHTUP_CS1237_DOUT_PORTx, RIGHTUP_CS1237_DOUT_PINx, Enable)
|
||||
#define CS1237_DOUT_IN() PORT_OE(RIGHTUP_CS1237_DOUT_PORTx, RIGHTUP_CS1237_DOUT_PINx, Disable)
|
||||
#define CS1237_DOUT_H() SET_RIGHTUP_CS1237_DOUT()
|
||||
#define CS1237_DOUT_L() CLR_RIGHTUP_CS1237_DOUT()
|
||||
#define CS1237_DOUT_GET() GET_RIGHTUP_CS1237_DOUT()
|
||||
|
||||
#define CS1237_SCLK_H() SET_RIGHTUP_CS1237_SCLK()
|
||||
#define CS1237_SCLK_L() CLR_RIGHTUP_CS1237_SCLK()
|
||||
|
||||
#define CS1237_5NS(x) delay_5ns(x) //5ns延时
|
||||
#define CS1237_1US(x) Ddl_Delay1us(x) //1us延时
|
||||
#define CS1237_1MS(x) Ddl_Delay1ms(x) //1ms延时
|
||||
|
||||
#define CS1237IntEnable() ExtInt04IntEnable()
|
||||
#define CS1237IntDisable() ExtInt04IntDisable()
|
||||
|
||||
RIGHTUP_CS1237Var_t RIGHTUP_CS1237Var;
|
||||
static bool InitFlag;
|
||||
static bool CS1237IrqFlag;
|
||||
static bool BuildDelay;
|
||||
static uint8_t CS1237Port;
|
||||
static uint8_t CS1237Hz;
|
||||
static uint8_t CS1237PGA;
|
||||
extern void RIGHTUP_CS1237AinADataProcessCallBack(int32_t AD);
|
||||
|
||||
|
||||
/** cs1237 时序时钟*/
|
||||
static void CS1237_Clock(void)
|
||||
{
|
||||
CS1237_SCLK_H();
|
||||
CS1237_5NS(60);
|
||||
CS1237_SCLK_L();
|
||||
CS1237_5NS(60);
|
||||
}
|
||||
/** cs1237 休眠*/
|
||||
static void CS1237_Sleep(void)
|
||||
{
|
||||
CS1237_SCLK_H();
|
||||
CS1237_1US(200);
|
||||
}
|
||||
/** cs1237 唤醒*/
|
||||
static void CS1237_WakeUp(void)
|
||||
{
|
||||
CS1237_SCLK_L();
|
||||
CS1237_1US(20);
|
||||
}
|
||||
/**设置CS1237寄存器*/
|
||||
static void Set_CS1237_Config(uint8_t ad_reg)
|
||||
{
|
||||
uint16_t bit_cout = 0;
|
||||
uint8_t reg_temp = 0x00;
|
||||
//DOUT由高变低之后开始读取数据
|
||||
CS1237_DOUT_OUT();
|
||||
CS1237_DOUT_H();
|
||||
CS1237_DOUT_IN();
|
||||
CS1237_SCLK_L(); //时钟拉低
|
||||
RIGHTUP_CS1237Var.CS1237Delay1mSCnt = 300;
|
||||
CS1237IrqFlag = false;
|
||||
while(CS1237IrqFlag == false) //等待芯片准备好
|
||||
{
|
||||
if(RIGHTUP_CS1237Var.CS1237Delay1mSCnt <= 0){
|
||||
//DBG_LOG("RIGHTUP CS1237 Preparation Timeout...\r\n");
|
||||
return; // 超时退出
|
||||
}
|
||||
}
|
||||
CS1237IntDisable();
|
||||
CS1237IrqFlag = false;
|
||||
|
||||
|
||||
/* clk1-clk26 写期间不需要操作*/
|
||||
for (bit_cout = 0; bit_cout < 26; bit_cout++)
|
||||
{
|
||||
CS1237_Clock(); //给一周期时钟
|
||||
}
|
||||
/* clk27 DOUT输出拉高*/
|
||||
CS1237_Clock(); //给一周期时钟
|
||||
CS1237_DOUT_H();
|
||||
/* clk28 - clk29 发送写寄存器命令字 */
|
||||
CS1237_Clock(); //给一周期时钟
|
||||
CS1237_Clock(); //给一周期时钟
|
||||
|
||||
/* clk30 - clk36 发送写寄存器命令字 */
|
||||
CS1237_DOUT_OUT();
|
||||
reg_temp = WRITE_CONFIG_CMD << 1; //命令长度为 7bits (写0x65)左移1位
|
||||
for (bit_cout = 0; bit_cout < 7; bit_cout++)
|
||||
{
|
||||
if (reg_temp & 0x80) //MSB
|
||||
{
|
||||
CS1237_DOUT_H();
|
||||
}
|
||||
else
|
||||
{
|
||||
CS1237_DOUT_L();
|
||||
}
|
||||
reg_temp = reg_temp << 1;
|
||||
CS1237_Clock();
|
||||
}
|
||||
/* clk37写寄存器模式还是输出 */
|
||||
CS1237_Clock();
|
||||
/* clk38 ~ clk45 写入寄存器值 */
|
||||
reg_temp = ad_reg;//要配件的寄存器数值
|
||||
for (bit_cout = 0; bit_cout < 8; bit_cout++)
|
||||
{
|
||||
if (reg_temp & 0x80) //MSB
|
||||
{
|
||||
CS1237_DOUT_H();
|
||||
}
|
||||
else
|
||||
{
|
||||
CS1237_DOUT_L();
|
||||
}
|
||||
reg_temp = reg_temp << 1;
|
||||
CS1237_Clock();
|
||||
}
|
||||
/* 8: clk46 */
|
||||
CS1237_Clock();
|
||||
CS1237_DOUT_H();
|
||||
CS1237_DOUT_IN();
|
||||
CS1237IntEnable();
|
||||
return ;
|
||||
}
|
||||
|
||||
/**读CS1237寄存器*/
|
||||
static int32_t Read_CS1237_Config(void)
|
||||
{
|
||||
uint16_t bit_cout = 0;
|
||||
uint8_t reg_temp = 0x00;
|
||||
//DOUT由高变低之后开始读取数据
|
||||
CS1237_DOUT_OUT();
|
||||
CS1237_DOUT_H();
|
||||
CS1237_DOUT_IN();
|
||||
CS1237_SCLK_L(); //时钟拉低
|
||||
RIGHTUP_CS1237Var.CS1237Delay1mSCnt = 300;
|
||||
CS1237IrqFlag = false;
|
||||
while(CS1237IrqFlag == false) //等待芯片准备好
|
||||
{
|
||||
if(RIGHTUP_CS1237Var.CS1237Delay1mSCnt <= 0){
|
||||
//DBG_LOG("RIGHTUP CS1237 Preparation Timeout...\r\n");
|
||||
return 0; // 超时退出
|
||||
}
|
||||
}
|
||||
CS1237IntDisable();
|
||||
CS1237IrqFlag = false;
|
||||
|
||||
/* clk1-clk26 写期间不需要操作*/
|
||||
for (bit_cout = 0; bit_cout < 26; bit_cout++)
|
||||
{
|
||||
CS1237_Clock(); //给一周期时钟
|
||||
}
|
||||
/* clk27 DOUT输出拉高*/
|
||||
CS1237_Clock(); //给一周期时钟
|
||||
CS1237_DOUT_H();
|
||||
/* clk28 - clk29 发送写寄存器命令字 */
|
||||
CS1237_Clock(); //给一周期时钟
|
||||
CS1237_Clock(); //给一周期时钟
|
||||
|
||||
/* clk30 - clk36 发送读寄存器命令字 */
|
||||
CS1237_DOUT_OUT();
|
||||
reg_temp = READ_CONFIG_CMD << 1; //命令长度为 7bits (写0x56)左移1位
|
||||
for (bit_cout = 0; bit_cout < 7; bit_cout++)
|
||||
{
|
||||
if (reg_temp & 0x80) //MSB
|
||||
{
|
||||
CS1237_DOUT_H();
|
||||
}
|
||||
else
|
||||
{
|
||||
CS1237_DOUT_L();
|
||||
}
|
||||
reg_temp = reg_temp << 1;
|
||||
CS1237_Clock();
|
||||
}
|
||||
/* clk37,读寄存器模式改输入 */
|
||||
CS1237_Clock();
|
||||
CS1237_DOUT_IN();
|
||||
for (bit_cout = 0; bit_cout < 8; bit_cout++)
|
||||
{
|
||||
CS1237_SCLK_H();
|
||||
reg_temp <<= 1; //左移1位准备接受数据 初始默认0
|
||||
CS1237_5NS(60);//延时300ns
|
||||
if(CS1237_DOUT_GET() == true) //有数值则累加
|
||||
reg_temp |= 1;
|
||||
CS1237_SCLK_L();
|
||||
CS1237_5NS(60);
|
||||
}
|
||||
/* 8: clk46 */
|
||||
CS1237_Clock();
|
||||
CS1237_DOUT_IN();
|
||||
CS1237_DOUT_H();
|
||||
CS1237IntEnable();
|
||||
return reg_temp ;
|
||||
}
|
||||
/**读取CS1237的AD数*/
|
||||
static int32_t Read_CS1237_Ad_Data(void)
|
||||
{
|
||||
uint16_t bit_cout = 0;
|
||||
int32_t data_temp = 0;
|
||||
|
||||
/* clk1 ~ clk24 ADC数据*/
|
||||
data_temp = 0;
|
||||
for (bit_cout = 0; bit_cout < 24; bit_cout++)
|
||||
{
|
||||
CS1237_SCLK_H();
|
||||
data_temp <<= 1; //左移1位准备接受数据 初始默认0
|
||||
CS1237_5NS(60);//延时300ns
|
||||
if(CS1237_DOUT_GET() == true) //有数值则累加
|
||||
data_temp |= 1;
|
||||
CS1237_SCLK_L();
|
||||
CS1237_5NS(60);
|
||||
}
|
||||
|
||||
/* clk25 ~ clk27 */
|
||||
for (bit_cout = 24; bit_cout < 27; bit_cout++)
|
||||
{
|
||||
CS1237_Clock(); //给一周期时钟
|
||||
}
|
||||
CS1237_DOUT_H();
|
||||
CS1237_SCLK_L();
|
||||
|
||||
if(data_temp > 0x7FFFFF) //取24位
|
||||
{
|
||||
data_temp |= 0xFF000000;
|
||||
}
|
||||
return data_temp;
|
||||
}
|
||||
|
||||
void RIGHTUP_CS1237_IrqCallBack(void)
|
||||
{
|
||||
CS1237IrqFlag = true;
|
||||
}
|
||||
void RIGHTUP_CS1237_Init(void)
|
||||
{
|
||||
CS1237IrqFlag = false;
|
||||
BuildDelay = false;
|
||||
RIGHTUP_CS1237Var.AinA_AD = 0;
|
||||
RIGHTUP_CS1237Var.Temp_AD = 0;
|
||||
RIGHTUP_CS1237Var.Jump_AD = 0;
|
||||
|
||||
CS1237IntEnable();
|
||||
CS1237Port = CH_SEL_A;
|
||||
CS1237Hz = SPEED_SEL_640Hz;
|
||||
CS1237PGA = PGA_SEL_128;
|
||||
|
||||
uint8_t read_reg = 0x00;
|
||||
uint8_t set_reg = REFO_ON | CS1237Hz | CS1237PGA | CS1237Port;
|
||||
CS1237_1MS(20);
|
||||
Set_CS1237_Config(set_reg);
|
||||
CS1237_1MS(20);
|
||||
read_reg = Read_CS1237_Config();
|
||||
CS1237_1MS(20);
|
||||
if(read_reg != set_reg){
|
||||
DBG_LOG("RIGHTUP CS1237 Init ERR...\r\n");
|
||||
//DBG_LOG("set_reg = %02X\tread_reg = %02X\r\n",set_reg,read_reg);
|
||||
InitFlag = true;
|
||||
}
|
||||
else {
|
||||
DBG_LOG("RIGHTUP CS1237 Init OK...\r\n");
|
||||
//DBG_LOG("set_reg = %02X\tread_reg = %02X\r\n",set_reg,read_reg);
|
||||
CS1237Port = read_reg & 0x03;
|
||||
InitFlag = true;
|
||||
}
|
||||
CS1237IntDisable();
|
||||
}
|
||||
void RIGHTUP_CS1237DataLoopCollect(void)
|
||||
{
|
||||
static int32_t ad_array[PACK_NUM];
|
||||
static uint8_t adcnt;
|
||||
static uint8_t TimeOutmagcnt;
|
||||
|
||||
switch(RIGHTUP_CS1237Var.Status) {
|
||||
case RUCS1237_STATUS_IDLE:{
|
||||
break;}
|
||||
|
||||
case RUCS1237_STATUS_START:{
|
||||
memset(&ad_array, 0x00, sizeof(ad_array));
|
||||
adcnt = 0;
|
||||
TimeOutmagcnt = 0;
|
||||
memset(&RIGHTUP_CS1237Var, NULL, sizeof(RIGHTUP_CS1237Var));
|
||||
if(BuildDelay == true)
|
||||
{
|
||||
BuildDelay = false;
|
||||
if(CS1237Hz == SPEED_SEL_10Hz){
|
||||
RIGHTUP_CS1237Var.CS1237Delay1mSCnt = tCon_10Hz;
|
||||
}
|
||||
if(CS1237Hz == SPEED_SEL_40Hz){
|
||||
RIGHTUP_CS1237Var.CS1237Delay1mSCnt = tCon_40Hz;
|
||||
}
|
||||
if(CS1237Hz == SPEED_SEL_640Hz){
|
||||
RIGHTUP_CS1237Var.CS1237Delay1mSCnt = tCon_640Hz;
|
||||
}
|
||||
if(CS1237Hz == SPEED_SEL6_1280Hz){
|
||||
RIGHTUP_CS1237Var.CS1237Delay1mSCnt = tCon_1280Hz;
|
||||
}
|
||||
RIGHTUP_CS1237Var.Status = RUCS1237_STATUS_DELAY;
|
||||
}
|
||||
else
|
||||
{
|
||||
RIGHTUP_CS1237Var.Status = RUCS1237_STATUS_READ;
|
||||
}
|
||||
break;}
|
||||
|
||||
case RUCS1237_STATUS_DELAY:{
|
||||
if(RIGHTUP_CS1237Var.CS1237Delay1mSCnt <= 0){
|
||||
RIGHTUP_CS1237Var.Status = RUCS1237_STATUS_READ;
|
||||
}
|
||||
break;}
|
||||
|
||||
case RUCS1237_STATUS_READ:{
|
||||
CS1237IrqFlag = false;
|
||||
RIGHTUP_CS1237Var.CS1237Delay1mSCnt = 100;
|
||||
RIGHTUP_CS1237Var.Status = RUCS1237_STATUS_WAIT_READ;
|
||||
break;}
|
||||
|
||||
case RUCS1237_STATUS_WAIT_READ:{
|
||||
if(RIGHTUP_CS1237Var.CS1237Delay1mSCnt <= 0){
|
||||
RIGHTUP_CS1237Var.Status = RUCS1237_STATUS_READ;
|
||||
TimeOutmagcnt++;
|
||||
}
|
||||
if(CS1237IrqFlag == true){
|
||||
CS1237IrqFlag = false;
|
||||
ad_array[adcnt++] = Read_CS1237_Ad_Data();
|
||||
RIGHTUP_CS1237Var.Status = RUCS1237_STATUS_READ;
|
||||
}
|
||||
if(TimeOutmagcnt >= PACK_NUM){
|
||||
TimeOutmagcnt = 0;
|
||||
if(adcnt > 0){
|
||||
if(CS1237Port == CH_SEL_A){
|
||||
RIGHTUP_CS1237Var.AinA_AD = IntFilter_32t(ad_array, adcnt, FILTER_NUM);
|
||||
RIGHTUP_CS1237AinADataProcessCallBack(RIGHTUP_CS1237Var.AinA_AD);
|
||||
}
|
||||
if(CS1237Port == CH_SEL_TEMP){
|
||||
RIGHTUP_CS1237Var.Temp_AD = IntFilter_32t(ad_array, adcnt, FILTER_NUM);
|
||||
//CS1237TempDataProcessCallBack(LEFTLOW_CS1237Var.Temp_AD);
|
||||
}
|
||||
if(CS1237Port == CH_SEL_JUMP){
|
||||
RIGHTUP_CS1237Var.Jump_AD = IntFilter_32t(ad_array, adcnt, FILTER_NUM);
|
||||
//CS1237JumpDataProcessCallBack(LEFTLOW_CS1237Var.Jump_AD);
|
||||
}
|
||||
RIGHTUP_CS1237Var.Status = RUCS1237_STATUS_CH_SEL;
|
||||
}
|
||||
else{
|
||||
if(CS1237Port == CH_SEL_A){
|
||||
DBG_LOG("RIGHTUP CS1237 CHA TimeOut...\r\n");
|
||||
}
|
||||
if(CS1237Port == CH_SEL_TEMP){
|
||||
DBG_LOG("RIGHTUP CS1237 Temp TimeOut...\r\n");
|
||||
}
|
||||
if(CS1237Port == CH_SEL_JUMP){
|
||||
DBG_LOG("RIGHTUP CS1237 Jump TimeOut...\r\n");
|
||||
}
|
||||
RIGHTUP_CS1237Var.Status = RUCS1237_STATUS_CH_SEL;
|
||||
}
|
||||
}
|
||||
if(adcnt >= PACK_NUM){
|
||||
if(CS1237Port == CH_SEL_A){
|
||||
RIGHTUP_CS1237Var.AinA_AD = IntFilter_32t(ad_array, adcnt, FILTER_NUM);
|
||||
RIGHTUP_CS1237AinADataProcessCallBack(RIGHTUP_CS1237Var.AinA_AD);
|
||||
}
|
||||
if(CS1237Port == CH_SEL_TEMP){
|
||||
RIGHTUP_CS1237Var.Temp_AD = IntFilter_32t(ad_array, adcnt, FILTER_NUM);
|
||||
//CS1237TempDataProcessCallBack(LEFTLOW_CS1237Var.Temp_AD);
|
||||
}
|
||||
if(CS1237Port == CH_SEL_JUMP){
|
||||
RIGHTUP_CS1237Var.Jump_AD = IntFilter_32t(ad_array, adcnt, FILTER_NUM);
|
||||
//CS1237JumpDataProcessCallBack(LEFTLOW_CS1237Var.Jump_AD);
|
||||
}
|
||||
RIGHTUP_CS1237Var.Status = RUCS1237_STATUS_CH_SEL;
|
||||
}
|
||||
break;}
|
||||
|
||||
case RUCS1237_STATUS_CH_SEL:{
|
||||
RIGHTUP_CS1237Var.Status = RUCS1237_STATUS_STOP;
|
||||
BuildDelay = false;
|
||||
uint8_t read_reg;
|
||||
if(CS1237Port == CH_SEL_A){
|
||||
#if(PORT_TEMP == 1)
|
||||
read_reg = Read_CS1237_Config();
|
||||
Set_CS1237_Config((read_reg & 0xFC) | CH_SEL_TEMP);
|
||||
CS1237Port = CH_SEL_TEMP;
|
||||
BuildDelay = true;
|
||||
break;
|
||||
#endif
|
||||
#if(PORT_JUMP == 1)
|
||||
read_reg = Read_CS1237_Config();
|
||||
Set_CS1237_Config((read_reg & 0xFC) | CH_SEL_JUMP);
|
||||
CS1237Port = CH_SEL_JUMP;
|
||||
BuildDelay = true;
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
|
||||
if(CS1237Port == CH_SEL_TEMP){
|
||||
#if(PORT_JUMP == 1)
|
||||
read_reg = Read_CS1238_Config();
|
||||
Set_CS1238_Config((read_reg & 0xFC) | CH_SEL_JUMP);
|
||||
CS1238Port = CH_SEL_JUMP;
|
||||
BuildDelay = true;
|
||||
break;
|
||||
#endif
|
||||
#if(PORT_A == 1)
|
||||
read_reg = Read_CS1237_Config();
|
||||
Set_CS1237_Config((read_reg & 0xFC) | CH_SEL_A);
|
||||
CS1237Port = CH_SEL_A;
|
||||
BuildDelay = true;
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
|
||||
if(CS1237Port == CH_SEL_JUMP){
|
||||
#if(PORT_A == 1)
|
||||
read_reg = Read_CS1237_Config();
|
||||
Set_CS1237_Config((read_reg & 0xFC) | CH_SEL_A);
|
||||
CS1237Port = CH_SEL_A;
|
||||
BuildDelay = true;
|
||||
break;
|
||||
#endif
|
||||
#if(PORT_TEMP == 1)
|
||||
read_reg = Read_CS1237_Config();
|
||||
Set_CS1237_Config((read_reg & 0xFC) | CH_SEL_TEMP);
|
||||
CS1237Port = CH_SEL_TEMP;
|
||||
BuildDelay = true;
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
break;}
|
||||
|
||||
case RUCS1237_STATUS_STOP:{
|
||||
RIGHTUP_CS1237Stop();
|
||||
RIGHTUP_CS1237Var.Status = RUCS1237_STATUS_IDLE;
|
||||
//RIGHTUP_CS1237Var.Status = RUCS1237_STATUS_START;//持续工作
|
||||
break;}
|
||||
}
|
||||
}
|
||||
void RIGHTUP_CS12371mSRoutine(void)
|
||||
{
|
||||
if(RIGHTUP_CS1237Var.CS1237Delay1mSCnt > 0)
|
||||
RIGHTUP_CS1237Var.CS1237Delay1mSCnt--;
|
||||
}
|
||||
void RIGHTUP_CS1237Start(void)
|
||||
{
|
||||
CS1237_WakeUp();
|
||||
CS1237_1MS(2);
|
||||
BuildDelay = true;
|
||||
CS1237IntEnable();
|
||||
if(!InitFlag){
|
||||
RIGHTUP_CS1237_Init();
|
||||
return;
|
||||
}
|
||||
RIGHTUP_CS1237Var.Status = RUCS1237_STATUS_START;
|
||||
}
|
||||
void RIGHTUP_CS1237Stop(void)
|
||||
{
|
||||
CS1237IntDisable();
|
||||
//CS1237_Sleep();
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user