传感器数据采集基本完成

This commit is contained in:
2025-09-14 04:00:03 +08:00
parent 4a33e4970a
commit ad5bf12ca0
22 changed files with 2191 additions and 1392 deletions
@@ -1,2 +0,0 @@
#include "bps.h"
@@ -4,6 +4,22 @@
#include "main.h"
#include "Algorithm.h"
#define CS1237_DOUT_OUT() PORT_OE(LEFTLOW_CS1237_DOUT_PORTx, LEFTLOW_CS1237_DOUT_PINx, Enable)
#define CS1237_DOUT_IN() PORT_OE(LEFTLOW_CS1237_DOUT_PORTx, LEFTLOW_CS1237_DOUT_PINx, Disable)
#define CS1237_DOUT_H() SET_LEFTLOW_CS1237_DOUT()
#define CS1237_DOUT_L() CLR_LEFTLOW_CS1237_DOUT()
#define CS1237_DOUT_GET() GET_LEFTLOW_CS1237_DOUT()
#define CS1237_SCLK_H() SET_LEFTLOW_CS1237_SCLK()
#define CS1237_SCLK_L() CLR_LEFTLOW_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() ExtInt01IntEnable()
#define CS1237IntDisable() ExtInt01IntDisable()
LEFTLOW_CS1237Var_t LEFTLOW_CS1237Var;
static bool InitFlag;
static bool CS1237IrqFlag;
@@ -18,15 +34,15 @@ extern void LEFTLOW_CS1237AinADataProcessCallBack(int32_t AD);
static void CS1237_Clock(void)
{
CS1237_SCLK_H();
CS1237_100NS(3);
CS1237_5NS(60);
CS1237_SCLK_L();
CS1237_100NS(3);
CS1237_5NS(60);
}
/** cs1237 休眠*/
static void CS1237_Sleep(void)
{
CS1237_SCLK_H();
CS1237_1US(150);
CS1237_1US(200);
}
/** cs1237 唤醒*/
static void CS1237_WakeUp(void)
@@ -48,8 +64,8 @@ static void Set_CS1237_Config(uint8_t ad_reg)
CS1237IrqFlag = false;
while(CS1237IrqFlag == false) //等待芯片准备好
{
if(CS1237Var.CS1237Delay1mSCnt <= 0){
DBG_LOG("LEFTLOW CS1237 Preparation Timeout...\r\n");
if(LEFTLOW_CS1237Var.CS1237Delay1mSCnt <= 0){
//DBG_LOG("LEFTLOW CS1237 Preparation Timeout...\r\n");
return; // 超时退出
}
}
@@ -97,7 +113,7 @@ static void Set_CS1237_Config(uint8_t ad_reg)
}
else
{
CS1238_DOUT_L();
CS1237_DOUT_L();
}
reg_temp = reg_temp << 1;
CS1237_Clock();
@@ -120,12 +136,12 @@ static int32_t Read_CS1237_Config(void)
CS1237_DOUT_H();
CS1237_DOUT_IN();
CS1237_SCLK_L(); //时钟拉低
CS1237Var.CS1237Delay1mSCnt = 300;
LEFTLOW_CS1237Var.CS1237Delay1mSCnt = 300;
CS1237IrqFlag = false;
while(CS1237IrqFlag == false) //等待芯片准备好
{
if(CS1237Var.CS1237Delay1mSCnt <= 0){
DBG_LOG("LEFTLOW CS1237 Preparation Timeout...\r\n");
if(LEFTLOW_CS1237Var.CS1237Delay1mSCnt <= 0){
//DBG_LOG("LEFTLOW CS1237 Preparation Timeout...\r\n");
return 0; // 超时退出
}
}
@@ -167,11 +183,11 @@ static int32_t Read_CS1237_Config(void)
{
CS1237_SCLK_H();
reg_temp <<= 1; //左移1位准备接受数据 初始默认0
CS1237_100NS(3);//延时300ns
if(GET_CS1237_DOUT() == true) //有数值则累加
CS1237_5NS(60);//延时300ns
if(CS1237_DOUT_GET() == true) //有数值则累加
reg_temp |= 1;
CS1237_SCLK_L();
CS1237_100NS(3);
CS1237_5NS(60);
}
/* 8: clk46 */
CS1237_Clock();
@@ -192,11 +208,11 @@ static int32_t Read_CS1237_Ad_Data(void)
{
CS1237_SCLK_H();
data_temp <<= 1; //左移1位准备接受数据 初始默认0
CS1237_100NS(3);//延时300ns
if(GET_CS1237_DOUT() == true) //有数值则累加
CS1237_5NS(60);//延时300ns
if(CS1237_DOUT_GET() == true) //有数值则累加
data_temp |= 1;
CS1237_SCLK_L();
CS1237_100NS(3);
CS1237_5NS(60);
}
/* clk25 ~ clk27 */
@@ -220,16 +236,16 @@ void LEFTLOW_CS1237_IrqCallBack(void)
}
void LEFTLOW_CS1237_Init(void)
{
CS1237IrqFlag = false;
BuildDelay = false;
CS1237IntEnable();
LEFTLOW_CS1237Var.AinA_AD = 0;
//CS1237Var.Ain2_AD = 0;
LEFTLOW_CS1237Var.Temp_AD = 0;
LEFTLOW_CS1237Var.Jump_AD = 0;
CS1237IntEnable();
CS1237Port = CH_SEL_A;
CS1237Hz = SPEED_SEL_40Hz;
CS1237Hz = SPEED_SEL_640Hz;
CS1237PGA = PGA_SEL_128;
uint8_t read_reg = 0x00;
@@ -241,8 +257,8 @@ void LEFTLOW_CS1237_Init(void)
CS1237_1MS(20);
if(read_reg != set_reg){
DBG_LOG("LEFTLOW CS1237 Init ERR...\r\n");
DBG_LOG("set_reg = %02X\tread_reg = %02X\r\n",set_reg,read_reg);
InitFlag = false;
//DBG_LOG("set_reg = %02X\tread_reg = %02X\r\n",set_reg,read_reg);
InitFlag = true;
}
else {
DBG_LOG("LEFTLOW CS1237 Init OK...\r\n");
@@ -250,6 +266,7 @@ void LEFTLOW_CS1237_Init(void)
CS1237Port = read_reg & 0x03;
InitFlag = true;
}
CS1237IntDisable();
}
void LEFTLOW_CS1237DataLoopCollect(void)
{
@@ -258,10 +275,10 @@ void LEFTLOW_CS1237DataLoopCollect(void)
static uint8_t TimeOutmagcnt;
switch(LEFTLOW_CS1237Var.Status) {
case CS1237_STATUS_IDLE:{
case LLCS1237_STATUS_IDLE:{
break;}
case CS1237_STATUS_START:{
case LLCS1237_STATUS_START:{
memset(&ad_array, 0x00, sizeof(ad_array));
adcnt = 0;
TimeOutmagcnt = 0;
@@ -281,35 +298,35 @@ void LEFTLOW_CS1237DataLoopCollect(void)
if(CS1237Hz == SPEED_SEL6_1280Hz){
LEFTLOW_CS1237Var.CS1237Delay1mSCnt = tCon_1280Hz;
}
LEFTLOW_CS1237Var.Status = CS1237_STATUS_DELAY;
LEFTLOW_CS1237Var.Status = LLCS1237_STATUS_DELAY;
}
else
{
LEFTLOW_CS1237Var.Status = CS1237_STATUS_READ;
LEFTLOW_CS1237Var.Status = LLCS1237_STATUS_READ;
}
break;}
case CS1237_STATUS_DELAY:{
case LLCS1237_STATUS_DELAY:{
if(LEFTLOW_CS1237Var.CS1237Delay1mSCnt <= 0){
LEFTLOW_CS1237Var.Status = CS1237_STATUS_READ;
LEFTLOW_CS1237Var.Status = LLCS1237_STATUS_READ;
}
break;}
case CS1237_STATUS_READ:{
case LLCS1237_STATUS_READ:{
CS1237IrqFlag = false;
LEFTLOW_CS1237Var.CS1237Delay1mSCnt = 100;
LEFTLOW_CS1237Var.Status = CS1237_STATUS_WAIT_READ;
LEFTLOW_CS1237Var.Status = LLCS1237_STATUS_WAIT_READ;
break;}
case CS1237_STATUS_WAIT_READ:{
case LLCS1237_STATUS_WAIT_READ:{
if(LEFTLOW_CS1237Var.CS1237Delay1mSCnt <= 0){
LEFTLOW_CS1237Var.Status = CS1237_STATUS_READ;
LEFTLOW_CS1237Var.Status = LLCS1237_STATUS_READ;
TimeOutmagcnt++;
}
if(CS1237IrqFlag == true){
CS1237IrqFlag = false;
ad_array[adcnt++] = Read_CS1237_Ad_Data();
LEFTLOW_CS1237Var.Status = CS1237_STATUS_READ;
LEFTLOW_CS1237Var.Status = LLCS1237_STATUS_READ;
}
if(TimeOutmagcnt >= PACK_NUM){
TimeOutmagcnt = 0;
@@ -326,19 +343,19 @@ void LEFTLOW_CS1237DataLoopCollect(void)
LEFTLOW_CS1237Var.Jump_AD = IntFilter_32t(ad_array, adcnt, FILTER_NUM);
//CS1237JumpDataProcessCallBack(LEFTLOW_CS1237Var.Jump_AD);
}
LEFTLOW_CS1237Var.Status = CS1237_STATUS_CH_SEL;
LEFTLOW_CS1237Var.Status = LLCS1237_STATUS_CH_SEL;
}
else{
if(CS1237Port == CH_SEL_A){
DBG_LOG("CS1238 CHA TimeOut...\r\n");
DBG_LOG("LEFTLOW CS1237 CHA TimeOut...\r\n");
}
if(CS1237Port == CH_SEL_TEMP){
DBG_LOG("CS1238 Temp TimeOut...\r\n");
DBG_LOG("LEFTLOW CS1237 Temp TimeOut...\r\n");
}
if(CS1237Port == CH_SEL_JUMP){
DBG_LOG("CS1238 Jump TimeOut...\r\n");
DBG_LOG("LEFTLOW CS1237 Jump TimeOut...\r\n");
}
LEFTLOW_CS1237Var.Status = CS1237_STATUS_CH_SEL;
LEFTLOW_CS1237Var.Status = LLCS1237_STATUS_CH_SEL;
}
}
if(adcnt >= PACK_NUM){
@@ -354,12 +371,12 @@ void LEFTLOW_CS1237DataLoopCollect(void)
LEFTLOW_CS1237Var.Jump_AD = IntFilter_32t(ad_array, adcnt, FILTER_NUM);
//CS1237JumpDataProcessCallBack(LEFTLOW_CS1237Var.Jump_AD);
}
LEFTLOW_CS1237Var.Status = CS1237_STATUS_CH_SEL;
LEFTLOW_CS1237Var.Status = LLCS1237_STATUS_CH_SEL;
}
break;}
case CS1237_STATUS_CH_SEL:{
LEFTLOW_CS1237Var.Status = CS1237_STATUS_STOP;
case LLCS1237_STATUS_CH_SEL:{
LEFTLOW_CS1237Var.Status = LLCS1237_STATUS_STOP;
BuildDelay = false;
uint8_t read_reg;
if(CS1237Port == CH_SEL_A){
@@ -414,10 +431,10 @@ void LEFTLOW_CS1237DataLoopCollect(void)
}
break;}
case CS1237_STATUS_STOP:{
//CS1237Stop();
//LEFTLOW_CS1237Var.Status = CS1237_STATUS_IDLE;
LEFTLOW_CS1237Var.Status = CS1237_STATUS_START;//持续工作
case LLCS1237_STATUS_STOP:{
LEFTLOW_CS1237Stop();
LEFTLOW_CS1237Var.Status = LLCS1237_STATUS_IDLE;
//LEFTLOW_CS1237Var.Status = LLCS1237_STATUS_START;//持续工作
break;}
}
}
@@ -426,22 +443,22 @@ void LEFTLOW_CS12371mSRoutine(void)
if(LEFTLOW_CS1237Var.CS1237Delay1mSCnt > 0)
LEFTLOW_CS1237Var.CS1237Delay1mSCnt--;
}
void LEFTLOW_CS1238Start(void)
void LEFTLOW_CS1237Start(void)
{
CS1237_WakeUp();
CS1237_1MS(2);
BuildDelay = true;
LEFTLOW_CS1237IntEnable();
CS1237IntEnable();
if(!InitFlag){
LEFTLOW_CS1237_Init();
return;
}
LEFTLOW_CS1237Var.Status = CS1237_STATUS_START;
LEFTLOW_CS1237Var.Status = LLCS1237_STATUS_START;
}
void LEFTLOW_CS1237Stop(void)
{
LEFTLOW_CS1237IntDisable();
CS1237_Sleep();
CS1237IntDisable();
//CS1237_Sleep();
}
@@ -26,18 +26,6 @@
#define CH_SEL_TEMP 0x02
#define CH_SEL_JUMP 0x03
#define CS1237_DOUT_OUT() SetBit(((uint32_t)&M0P_GPIO->PADIR + LEFTLOW_CS1237_DOUT_PORTx), LEFTLOW_CS1237_DOUT_PINx, 0)
#define CS1237_DOUT_IN() SetBit(((uint32_t)&M0P_GPIO->PADIR + LEFTLOW_CS1237_DOUT_PORTx), LEFTLOW_CS1237_DOUT_PINx, 1)
#define CS1237_DOUT_H() SET_LEFTLOW_CS1237_DOUT()
#define CS1237_DOUT_L() CLR_LEFTLOW_CS1237_DOUT()
#define CS1237_SCLK_H() SET_LEFTLOW_CS1237_SCLK()
#define CS1237_SCLK_L() CLR_LEFTLOW_CS1237_SCLK()
#define CS1237_1US(x) delay_us(x) //1us延时
#define CS1237_100NS(x) delay_ns(x) //100ns延时
#define CS1237_1MS(x) delay_ms(x) //1ms延时
/*Definition of conversion time corresponding to repeatability setting*/
/*
10Hz //建立时间300ms
@@ -54,35 +42,33 @@
//#define PORT_B 1 //采集通道B
#define PORT_TEMP 0 //采集温度
#define PORT_JUMP 0 //内短采集
#define PACK_NUM 10 //一次采集的数据包数量
#define FILTER_NUM 4 //滤波数
#define PACK_NUM 1 //一次采集的数据包数量
#define FILTER_NUM 0 //滤波数
typedef enum{
CS1237_STATUS_IDLE,
CS1237_STATUS_START,
CS1237_STATUS_DELAY,
CS1237_STATUS_READ,
CS1237_STATUS_WAIT_READ,
CS1237_STATUS_CH_SEL,
CS1237_STATUS_STOP,
}CS1237Status_m;
LLCS1237_STATUS_IDLE,
LLCS1237_STATUS_START,
LLCS1237_STATUS_DELAY,
LLCS1237_STATUS_READ,
LLCS1237_STATUS_WAIT_READ,
LLCS1237_STATUS_CH_SEL,
LLCS1237_STATUS_STOP,
}LeftLowCS1237Status_m;
typedef struct{
CS1237Status_m Status;
LeftLowCS1237Status_m Status;
uint32_t CS1237Delay1mSCnt;
int32_t AinA_AD;//AINAad数据
//int32_t Ain2_AD;//AIN2ad数据
//int32_t AinB_AD;//AINBad数据
int32_t Temp_AD;//温度ad数据
int32_t Jump_AD;//内短ad数据
}
LEFTLOW_CS1237Var_t;
extern LEFTLOW_CS1237Var_t LEFTLOW_CS1237Var;
void LEFTLOW_CS1237_Init(void);
void LEFTLOW_CS1237_IrqCallBack(void);
void LEFTLOW_CS1237DataLoopCollect(void);
void LEFTLOW_CS1237LoopHandler(void);
void LEFTLOW_CS12371mSRoutine(void);
void LEFTLOW_CS1237Start(void);
void LEFTLOW_CS1237Stop(void);
@@ -1,189 +1,203 @@
#include "CS1238.h"
#include "UartDebug.h"
#include "CS1237_LEFTUP.h"
#include "Debug.h"
#include "bsp.h"
#include "main.h"
#include "Algorithm.h"
CS1238Var_t CS1238Var;
static bool InitFlag;
static bool CS1238IrqFlag;
static bool BuildDelay;
static uint8_t CS1238Port;
static uint8_t CS1238Hz;
static uint8_t CS1238PGA;
extern void CS1238Ain1DataProcessCallBack(int32_t AD);
extern void CS1238Ain2DataProcessCallBack(int32_t AD);
extern void CS1238TempDataProcessCallBack(int32_t AD);
extern void CS1238JumpDataProcessCallBack(int32_t AD);
#define CS1237_DOUT_OUT() PORT_OE(LEFTUP_CS1237_DOUT_PORTx, LEFTUP_CS1237_DOUT_PINx, Enable)
#define CS1237_DOUT_IN() PORT_OE(LEFTUP_CS1237_DOUT_PORTx, LEFTUP_CS1237_DOUT_PINx, Disable)
#define CS1237_DOUT_H() SET_LEFTUP_CS1237_DOUT()
#define CS1237_DOUT_L() CLR_LEFTUP_CS1237_DOUT()
#define CS1237_DOUT_GET() GET_LEFTUP_CS1237_DOUT()
/** cs1238 时序时钟*/
static void CS1238_Clock(void)
#define CS1237_SCLK_H() SET_LEFTUP_CS1237_SCLK()
#define CS1237_SCLK_L() CLR_LEFTUP_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() ExtInt10IntEnable()
#define CS1237IntDisable() ExtInt10IntDisable()
LEFTUP_CS1237Var_t LEFTUP_CS1237Var;
static bool InitFlag;
static bool CS1237IrqFlag;
static bool BuildDelay;
static uint8_t CS1237Port;
static uint8_t CS1237Hz;
static uint8_t CS1237PGA;
extern void LEFTUP_CS1237AinADataProcessCallBack(int32_t AD);
/** cs1237 时序时钟*/
static void CS1237_Clock(void)
{
CS1238_SCLK_H();
CS1238_100NS(3);
CS1238_SCLK_L();
CS1238_100NS(3);
CS1237_SCLK_H();
CS1237_5NS(60);
CS1237_SCLK_L();
CS1237_5NS(60);
}
/** cs1238 休眠*/
static void CS1238_Sleep(void)
/** cs1237 休眠*/
static void CS1237_Sleep(void)
{
CS1238_SCLK_H();
CS1238_1US(150);
CS1237_SCLK_H();
CS1237_1US(200);
}
/** cs1238 唤醒*/
static void CS1238_WakeUp(void)
/** cs1237 唤醒*/
static void CS1237_WakeUp(void)
{
CS1238_SCLK_L();
CS1238_1US(20);
CS1237_SCLK_L();
CS1237_1US(20);
}
/**设置CS1238寄存器*/
static void Set_CS1238_Config(uint8_t ad_reg)
/**设置CS1237寄存器*/
static void Set_CS1237_Config(uint8_t ad_reg)
{
uint16_t bit_cout = 0;
uint8_t reg_temp = 0x00;
//DOUT由高变低之后开始读取数据
CS1238_DOUT_OUT();
CS1238_DOUT_H();
CS1238_DOUT_IN();
CS1238_SCLK_L(); //时钟拉低
CS1238Var.CS1238Delay1mSCnt = 300;
CS1238IrqFlag = false;
while(CS1238IrqFlag == false) //等待芯片准备好
CS1237_DOUT_OUT();
CS1237_DOUT_H();
CS1237_DOUT_IN();
CS1237_SCLK_L(); //时钟拉低
LEFTUP_CS1237Var.CS1237Delay1mSCnt = 300;
CS1237IrqFlag = false;
while(CS1237IrqFlag == false) //等待芯片准备好
{
if(CS1238Var.CS1238Delay1mSCnt <= 0){
DBG_LOG("CS1238 Preparation Timeout...\r\n");
if(LEFTUP_CS1237Var.CS1237Delay1mSCnt <= 0){
//DBG_LOG("LEFTUP CS1237 Preparation Timeout...\r\n");
return; // 超时退出
}
}
CS1238IntDisable();
CS1238IrqFlag = false;
CS1237IntDisable();
CS1237IrqFlag = false;
/* clk1-clk26 写期间不需要操作*/
for (bit_cout = 0; bit_cout < 26; bit_cout++)
{
CS1238_Clock(); //给一周期时钟
CS1237_Clock(); //给一周期时钟
}
/* clk27 DOUT输出拉高*/
CS1238_Clock(); //给一周期时钟
CS1238_DOUT_H();
CS1237_Clock(); //给一周期时钟
CS1237_DOUT_H();
/* clk28 - clk29 发送写寄存器命令字 */
CS1238_Clock(); //给一周期时钟
CS1238_Clock(); //给一周期时钟
CS1237_Clock(); //给一周期时钟
CS1237_Clock(); //给一周期时钟
/* clk30 - clk36 发送写寄存器命令字 */
CS1238_DOUT_OUT();
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
{
CS1238_DOUT_H();
CS1237_DOUT_H();
}
else
{
CS1238_DOUT_L();
CS1237_DOUT_L();
}
reg_temp = reg_temp << 1;
CS1238_Clock();
CS1237_Clock();
}
/* clk37写寄存器模式还是输出 */
CS1238_Clock();
CS1237_Clock();
/* clk38 ~ clk45 写入寄存器值 */
reg_temp = ad_reg;//要配件的寄存器数值
for (bit_cout = 0; bit_cout < 8; bit_cout++)
{
if (reg_temp & 0x80) //MSB
{
CS1238_DOUT_H();
CS1237_DOUT_H();
}
else
{
CS1238_DOUT_L();
CS1237_DOUT_L();
}
reg_temp = reg_temp << 1;
CS1238_Clock();
CS1237_Clock();
}
/* 8: clk46 */
CS1238_Clock();
CS1238_DOUT_H();
CS1238_DOUT_IN();
CS1238IntEnable();
CS1237_Clock();
CS1237_DOUT_H();
CS1237_DOUT_IN();
CS1237IntEnable();
return ;
}
/**读CS1238寄存器*/
static int32_t Read_CS1238_Config(void)
/**读CS1237寄存器*/
static int32_t Read_CS1237_Config(void)
{
uint16_t bit_cout = 0;
uint8_t reg_temp = 0x00;
//DOUT由高变低之后开始读取数据
CS1238_DOUT_OUT();
CS1238_DOUT_H();
CS1238_DOUT_IN();
CS1238_SCLK_L(); //时钟拉低
CS1238Var.CS1238Delay1mSCnt = 300;
CS1238IrqFlag = false;
while(CS1238IrqFlag == false) //等待芯片准备好
CS1237_DOUT_OUT();
CS1237_DOUT_H();
CS1237_DOUT_IN();
CS1237_SCLK_L(); //时钟拉低
LEFTUP_CS1237Var.CS1237Delay1mSCnt = 300;
CS1237IrqFlag = false;
while(CS1237IrqFlag == false) //等待芯片准备好
{
if(CS1238Var.CS1238Delay1mSCnt <= 0){
DBG_LOG("CS1238 Preparation Timeout...\r\n");
if(LEFTUP_CS1237Var.CS1237Delay1mSCnt <= 0){
//DBG_LOG("LEFTUP CS1237 Preparation Timeout...\r\n");
return 0; // 超时退出
}
}
CS1238IntDisable();
CS1238IrqFlag = false;
CS1237IntDisable();
CS1237IrqFlag = false;
/* clk1-clk26 写期间不需要操作*/
for (bit_cout = 0; bit_cout < 26; bit_cout++)
{
CS1238_Clock(); //给一周期时钟
CS1237_Clock(); //给一周期时钟
}
/* clk27 DOUT输出拉高*/
CS1238_Clock(); //给一周期时钟
CS1238_DOUT_H();
CS1237_Clock(); //给一周期时钟
CS1237_DOUT_H();
/* clk28 - clk29 发送写寄存器命令字 */
CS1238_Clock(); //给一周期时钟
CS1238_Clock(); //给一周期时钟
CS1237_Clock(); //给一周期时钟
CS1237_Clock(); //给一周期时钟
/* clk30 - clk36 发送读寄存器命令字 */
CS1238_DOUT_OUT();
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
{
CS1238_DOUT_H();
CS1237_DOUT_H();
}
else
{
CS1238_DOUT_L();
CS1237_DOUT_L();
}
reg_temp = reg_temp << 1;
CS1238_Clock();
CS1237_Clock();
}
/* clk37,读寄存器模式改输入 */
CS1238_Clock();
CS1238_DOUT_IN();
CS1237_Clock();
CS1237_DOUT_IN();
for (bit_cout = 0; bit_cout < 8; bit_cout++)
{
CS1238_SCLK_H();
CS1237_SCLK_H();
reg_temp <<= 1; //左移1位准备接受数据 初始默认0
CS1238_100NS(3);//延时300ns
if(GET_CS1238_DOUT() == true) //有数值则累加
CS1237_5NS(60);//延时300ns
if(CS1237_DOUT_GET() == true) //有数值则累加
reg_temp |= 1;
CS1238_SCLK_L();
CS1238_100NS(3);
CS1237_SCLK_L();
CS1237_5NS(60);
}
/* 8: clk46 */
CS1238_Clock();
CS1238_DOUT_IN();
CS1238_DOUT_H();
CS1238IntEnable();
CS1237_Clock();
CS1237_DOUT_IN();
CS1237_DOUT_H();
CS1237IntEnable();
return reg_temp ;
}
/**读取CS1238的AD数*/
static int32_t Read_CS1238_Ad_Data(void)
/**读取CS1237的AD数*/
static int32_t Read_CS1237_Ad_Data(void)
{
uint16_t bit_cout = 0;
int32_t data_temp = 0;
@@ -192,22 +206,22 @@ static int32_t Read_CS1238_Ad_Data(void)
data_temp = 0;
for (bit_cout = 0; bit_cout < 24; bit_cout++)
{
CS1238_SCLK_H();
CS1237_SCLK_H();
data_temp <<= 1; //左移1位准备接受数据 初始默认0
CS1238_100NS(3);//延时300ns
if(GET_CS1238_DOUT() == true) //有数值则累加
CS1237_5NS(60);//延时300ns
if(CS1237_DOUT_GET() == true) //有数值则累加
data_temp |= 1;
CS1238_SCLK_L();
CS1238_100NS(3);
CS1237_SCLK_L();
CS1237_5NS(60);
}
/* clk25 ~ clk27 */
for (bit_cout = 24; bit_cout < 27; bit_cout++)
{
CS1238_Clock(); //给一周期时钟
CS1237_Clock(); //给一周期时钟
}
CS1238_DOUT_H();
CS1238_SCLK_L();
CS1237_DOUT_H();
CS1237_SCLK_L();
if(data_temp > 0x7FFFFF) //取24位
{
@@ -216,190 +230,172 @@ static int32_t Read_CS1238_Ad_Data(void)
return data_temp;
}
void CS1238_IrqCallBack(void)
void LEFTUP_CS1237_IrqCallBack(void)
{
CS1238IrqFlag = true;
CS1237IrqFlag = true;
}
void CS1238_Init(void)
void LEFTUP_CS1237_Init(void)
{
CS1238IrqFlag = false;
CS1237IrqFlag = false;
BuildDelay = false;
CS1238IntEnable();
CS1238Var.Ain1_AD = 0;
CS1238Var.Ain2_AD = 0;
CS1238Var.Temp_AD = 0;
CS1238Var.Jump_AD = 0;
LEFTUP_CS1237Var.AinA_AD = 0;
LEFTUP_CS1237Var.Temp_AD = 0;
LEFTUP_CS1237Var.Jump_AD = 0;
CS1238Port = CH_SEL_A;
CS1238Hz = SPEED_SEL_640Hz;
CS1238PGA = PGA_SEL_128;
CS1237IntEnable();
CS1237Port = CH_SEL_A;
CS1237Hz = SPEED_SEL_640Hz;
CS1237PGA = PGA_SEL_128;
uint8_t read_reg = 0x00;
uint8_t set_reg = REFO_ON | CS1238Hz | CS1238PGA | CS1238Port;
CS1238_1MS(20);
Set_CS1238_Config(set_reg);
CS1238_1MS(20);
read_reg = Read_CS1238_Config();
CS1238_1MS(20);
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("CS1238 Init ERR...\r\n");
DBG_LOG("set_reg = %02X\tread_reg = %02X\r\n",set_reg,read_reg);
InitFlag = false;
}
else {
DBG_LOG("CS1238 Init OK...\r\n");
DBG_LOG("LEFTUP CS1237 Init ERR...\r\n");
//DBG_LOG("set_reg = %02X\tread_reg = %02X\r\n",set_reg,read_reg);
CS1238Port = read_reg & 0x03;
InitFlag = true;
}
else {
DBG_LOG("LEFTUP 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 CS1238DataLoopCollect(void)
void LEFTUP_CS1237DataLoopCollect(void)
{
static int32_t ad_array[PACK_NUM];
static uint8_t adcnt;
static uint8_t TimeOutmagcnt;
switch(CS1238Var.Status) {
case CS1238_STATUS_IDLE:{
switch(LEFTUP_CS1237Var.Status) {
case LUCS1237_STATUS_IDLE:{
break;}
case CS1238_STATUS_START:{
case LUCS1237_STATUS_START:{
memset(&ad_array, 0x00, sizeof(ad_array));
adcnt = 0;
TimeOutmagcnt = 0;
memset(&CS1238Var, NULL, sizeof(CS1238Var));
memset(&LEFTUP_CS1237Var, NULL, sizeof(LEFTUP_CS1237Var));
if(BuildDelay == true)
{
BuildDelay = false;
if(CS1238Hz == SPEED_SEL_10Hz){
CS1238Var.CS1238Delay1mSCnt = tCon_10Hz;
if(CS1237Hz == SPEED_SEL_10Hz){
LEFTUP_CS1237Var.CS1237Delay1mSCnt = tCon_10Hz;
}
if(CS1238Hz == SPEED_SEL_40Hz){
CS1238Var.CS1238Delay1mSCnt = tCon_40Hz;
if(CS1237Hz == SPEED_SEL_40Hz){
LEFTUP_CS1237Var.CS1237Delay1mSCnt = tCon_40Hz;
}
if(CS1238Hz == SPEED_SEL_640Hz){
CS1238Var.CS1238Delay1mSCnt = tCon_640Hz;
if(CS1237Hz == SPEED_SEL_640Hz){
LEFTUP_CS1237Var.CS1237Delay1mSCnt = tCon_640Hz;
}
if(CS1238Hz == SPEED_SEL6_1280Hz){
CS1238Var.CS1238Delay1mSCnt = tCon_1280Hz;
if(CS1237Hz == SPEED_SEL6_1280Hz){
LEFTUP_CS1237Var.CS1237Delay1mSCnt = tCon_1280Hz;
}
CS1238Var.Status = CS1238_STATUS_DELAY;
LEFTUP_CS1237Var.Status = LUCS1237_STATUS_DELAY;
}
else
{
CS1238Var.Status = CS1238_STATUS_READ;
LEFTUP_CS1237Var.Status = LUCS1237_STATUS_READ;
}
break;}
case CS1238_STATUS_DELAY:{
if(CS1238Var.CS1238Delay1mSCnt <= 0){
CS1238Var.Status = CS1238_STATUS_READ;
case LUCS1237_STATUS_DELAY:{
if(LEFTUP_CS1237Var.CS1237Delay1mSCnt <= 0){
LEFTUP_CS1237Var.Status = LUCS1237_STATUS_READ;
}
break;}
case CS1238_STATUS_READ:{
CS1238IrqFlag = false;
CS1238Var.CS1238Delay1mSCnt = 100;
CS1238Var.Status = CS1238_STATUS_WAIT_READ;
case LUCS1237_STATUS_READ:{
CS1237IrqFlag = false;
LEFTUP_CS1237Var.CS1237Delay1mSCnt = 100;
LEFTUP_CS1237Var.Status = LUCS1237_STATUS_WAIT_READ;
break;}
case CS1238_STATUS_WAIT_READ:{
if(CS1238Var.CS1238Delay1mSCnt <= 0){
CS1238Var.Status = CS1238_STATUS_READ;
case LUCS1237_STATUS_WAIT_READ:{
if(LEFTUP_CS1237Var.CS1237Delay1mSCnt <= 0){
LEFTUP_CS1237Var.Status = LUCS1237_STATUS_READ;
TimeOutmagcnt++;
}
if(CS1238IrqFlag == true){
CS1238IrqFlag = false;
ad_array[adcnt++] = Read_CS1238_Ad_Data();
CS1238Var.Status = CS1238_STATUS_READ;
if(CS1237IrqFlag == true){
CS1237IrqFlag = false;
ad_array[adcnt++] = Read_CS1237_Ad_Data();
LEFTUP_CS1237Var.Status = LUCS1237_STATUS_READ;
}
if(TimeOutmagcnt >= PACK_NUM){
TimeOutmagcnt = 0;
if(adcnt > 0){
if(CS1238Port == CH_SEL_A){
CS1238Var.Ain1_AD = IntFilter_32t(ad_array, adcnt, 4);
CS1238Ain1DataProcessCallBack(CS1238Var.Ain1_AD);
if(CS1237Port == CH_SEL_A){
LEFTUP_CS1237Var.AinA_AD = IntFilter_32t(ad_array, adcnt, FILTER_NUM);
LEFTUP_CS1237AinADataProcessCallBack(LEFTUP_CS1237Var.AinA_AD);
}
if(CS1238Port == CH_SEL_B){
CS1238Var.Ain2_AD = IntFilter_32t(ad_array, adcnt, 4);
CS1238Ain2DataProcessCallBack(CS1238Var.Ain2_AD);
if(CS1237Port == CH_SEL_TEMP){
LEFTUP_CS1237Var.Temp_AD = IntFilter_32t(ad_array, adcnt, FILTER_NUM);
//CS1237TempDataProcessCallBack(LEFTLOW_CS1237Var.Temp_AD);
}
if(CS1238Port == CH_SEL_TEMP){
CS1238Var.Temp_AD = IntFilter_32t(ad_array, adcnt, 4);
CS1238TempDataProcessCallBack(CS1238Var.Temp_AD);
if(CS1237Port == CH_SEL_JUMP){
LEFTUP_CS1237Var.Jump_AD = IntFilter_32t(ad_array, adcnt, FILTER_NUM);
//CS1237JumpDataProcessCallBack(LEFTLOW_CS1237Var.Jump_AD);
}
if(CS1238Port == CH_SEL_JUMP){
CS1238Var.Jump_AD = IntFilter_32t(ad_array, adcnt, 4);
CS1238JumpDataProcessCallBack(CS1238Var.Jump_AD);
}
CS1238Var.Status = CS1238_STATUS_CH_SEL;
LEFTUP_CS1237Var.Status = LUCS1237_STATUS_CH_SEL;
}
else{
if(CS1238Port == CH_SEL_A){
DBG_LOG("CS1238 CHA TimeOut...\r\n");
if(CS1237Port == CH_SEL_A){
DBG_LOG("LEFTUPs CS1237 CHA TimeOut...\r\n");
}
if(CS1238Port == CH_SEL_B){
DBG_LOG("CS1238 CHB TimeOut...\r\n");
if(CS1237Port == CH_SEL_TEMP){
DBG_LOG("LEFTUP CS1237 Temp TimeOut...\r\n");
}
if(CS1238Port == CH_SEL_TEMP){
DBG_LOG("CS1238 Temp TimeOut...\r\n");
if(CS1237Port == CH_SEL_JUMP){
DBG_LOG("LEFTUP CS1237 Jump TimeOut...\r\n");
}
if(CS1238Port == CH_SEL_JUMP){
DBG_LOG("CS1238 Jump TimeOut...\r\n");
}
CS1238Var.Status = CS1238_STATUS_CH_SEL;
LEFTUP_CS1237Var.Status = LUCS1237_STATUS_CH_SEL;
}
}
if(adcnt >= PACK_NUM){
if(CS1238Port == CH_SEL_A){
CS1238Var.Ain1_AD = IntFilter_32t(ad_array, adcnt, 4);
CS1238Ain1DataProcessCallBack(CS1238Var.Ain1_AD);
if(CS1237Port == CH_SEL_A){
LEFTUP_CS1237Var.AinA_AD = IntFilter_32t(ad_array, adcnt, FILTER_NUM);
LEFTUP_CS1237AinADataProcessCallBack(LEFTUP_CS1237Var.AinA_AD);
}
if(CS1238Port == CH_SEL_B){
CS1238Var.Ain2_AD = IntFilter_32t(ad_array, adcnt, 4);
CS1238Ain2DataProcessCallBack(CS1238Var.Ain2_AD);
if(CS1237Port == CH_SEL_TEMP){
LEFTUP_CS1237Var.Temp_AD = IntFilter_32t(ad_array, adcnt, FILTER_NUM);
//CS1237TempDataProcessCallBack(LEFTLOW_CS1237Var.Temp_AD);
}
if(CS1238Port == CH_SEL_TEMP){
CS1238Var.Temp_AD = IntFilter_32t(ad_array, adcnt, 4);
CS1238TempDataProcessCallBack(CS1238Var.Temp_AD);
if(CS1237Port == CH_SEL_JUMP){
LEFTUP_CS1237Var.Jump_AD = IntFilter_32t(ad_array, adcnt, FILTER_NUM);
//CS1237JumpDataProcessCallBack(LEFTLOW_CS1237Var.Jump_AD);
}
if(CS1238Port == CH_SEL_JUMP){
CS1238Var.Jump_AD = IntFilter_32t(ad_array, adcnt, 4);
CS1238JumpDataProcessCallBack(CS1238Var.Jump_AD);
}
CS1238Var.Status = CS1238_STATUS_CH_SEL;
LEFTUP_CS1237Var.Status = LUCS1237_STATUS_CH_SEL;
}
break;}
case CS1238_STATUS_CH_SEL:{
CS1238Var.Status = CS1238_STATUS_STOP;
case LUCS1237_STATUS_CH_SEL:{
LEFTUP_CS1237Var.Status = LUCS1237_STATUS_STOP;
BuildDelay = false;
uint8_t read_reg;
if(CS1238Port == CH_SEL_A){
if(CS1237Port == CH_SEL_A){
#if(PORT_TEMP == 1)
read_reg = Read_CS1238_Config();
Set_CS1238_Config((read_reg & 0xFC) | CH_SEL_TEMP);
CS1238Port = CH_SEL_TEMP;
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_CS1238_Config();
Set_CS1238_Config((read_reg & 0xFC) | CH_SEL_JUMP);
CS1238Port = CH_SEL_JUMP;
read_reg = Read_CS1237_Config();
Set_CS1237_Config((read_reg & 0xFC) | CH_SEL_JUMP);
CS1237Port = CH_SEL_JUMP;
BuildDelay = true;
break;
#endif
}
if(CS1238Port == CH_SEL_B){
#if(PORT_TEMP == 1)
read_reg = Read_CS1238_Config();
Set_CS1238_Config((read_reg & 0xFC) | CH_SEL_TEMP);
CS1238Port = CH_SEL_TEMP;
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);
@@ -408,77 +404,60 @@ void CS1238DataLoopCollect(void)
break;
#endif
#if(PORT_A == 1)
read_reg = Read_CS1238_Config();
Set_CS1238_Config((read_reg & 0xFC) | CH_SEL_A);
CS1238Port = CH_SEL_A;
BuildDelay = true;
break;
#endif
}
if(CS1238Port == 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_CS1238_Config();
Set_CS1238_Config((read_reg & 0xFC) | CH_SEL_A);
CS1238Port = CH_SEL_A;
read_reg = Read_CS1237_Config();
Set_CS1237_Config((read_reg & 0xFC) | CH_SEL_A);
CS1237Port = CH_SEL_A;
BuildDelay = true;
break;
#endif
}
if(CS1238Port == CH_SEL_JUMP){
if(CS1237Port == CH_SEL_JUMP){
#if(PORT_A == 1)
read_reg = Read_CS1238_Config();
Set_CS1238_Config((read_reg & 0xFC) | CH_SEL_A);
CS1238Port = CH_SEL_A;
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_CS1238_Config();
Set_CS1238_Config((read_reg & 0xFC) | CH_SEL_TEMP);
CS1238Port = CH_SEL_TEMP;
read_reg = Read_CS1237_Config();
Set_CS1237_Config((read_reg & 0xFC) | CH_SEL_TEMP);
CS1237Port = CH_SEL_TEMP;
BuildDelay = true;
break;
#endif
}
break;}
case CS1238_STATUS_STOP:{
//CS1238Stop();
//CS1238Var.Status = CS1238_STATUS_IDLE;
CS1238Var.Status = CS1238_STATUS_START;//持续工作
case LUCS1237_STATUS_STOP:{
LEFTUP_CS1237Stop();
LEFTUP_CS1237Var.Status = LUCS1237_STATUS_IDLE;
//LEFTUP_CS1237Var.Status = LUCS1237_STATUS_START;//持续工作
break;}
}
}
void CS12381mSRoutine(void)
void LEFTUP_CS12371mSRoutine(void)
{
if(CS1238Var.CS1238Delay1mSCnt > 0)
CS1238Var.CS1238Delay1mSCnt--;
if(LEFTUP_CS1237Var.CS1237Delay1mSCnt > 0)
LEFTUP_CS1237Var.CS1237Delay1mSCnt--;
}
void CS1238Start(void)
void LEFTUP_CS1237Start(void)
{
CS1238_WakeUp();
CS1238_1MS(2);
CS1237_WakeUp();
CS1237_1MS(2);
BuildDelay = true;
CS1238IntEnable();
CS1237IntEnable();
if(!InitFlag){
CS1238_Init();
LEFTUP_CS1237_Init();
return;
}
CS1238Var.Status = CS1238_STATUS_START;
LEFTUP_CS1237Var.Status = LUCS1237_STATUS_START;
}
void CS1238Stop(void)
void LEFTUP_CS1237Stop(void)
{
CS1238IntDisable();
CS1238_Sleep();
CS1237IntDisable();
//CS1237_Sleep();
}
@@ -1,7 +1,7 @@
#include "bsp.h"
#ifndef _CS1238_H_
#define _CS1238_H_
#ifndef _CS1237_LEFTUP_H_
#define _CS1237_LEFTUP_H_
#define READ_CONFIG_CMD 0x56
#define WRITE_CONFIG_CMD 0x65
@@ -22,21 +22,11 @@
#define PGA_SEL_128 0x0C
#define CH_SEL_A 0x00
#define CH_SEL_B 0x01
//#define CH_SEL_B 0x01
#define CH_SEL_TEMP 0x02
#define CH_SEL_JUMP 0x03
#define CS1238_DOUT_OUT() SetBit(((uint32_t)&M0P_GPIO->PADIR + CS1238_DOUT_PORTx), CS1238_DOUT_PINx, 0)
#define CS1238_DOUT_IN() SetBit(((uint32_t)&M0P_GPIO->PADIR + CS1238_DOUT_PORTx), CS1238_DOUT_PINx, 1)
#define CS1238_DOUT_H() SET_CS1238_DOUT()
#define CS1238_DOUT_L() CLR_CS1238_DOUT()
#define CS1238_SCLK_H() SET_CS1238_SCLK()
#define CS1238_SCLK_L() CLR_CS1238_SCLK()
#define CS1238_1US(x) delay_us(x) //1us延时
#define CS1238_100NS(x) delay_ns(x) //100ns延时
#define CS1238_1MS(x) delay_ms(x) //1ms延时
/*Definition of conversion time corresponding to repeatability setting*/
/*
@@ -51,40 +41,39 @@
#define tCon_1280Hz 4 /* ms. */
#define PORT_A 1 //采集通道A
#define PORT_B 1 //采集通道B
#define PORT_TEMP 0 //采集温度
#define PORT_JUMP 0 //内短采集
#define PACK_NUM 10 //一次采集的数据包数量
//#define PORT_B 1 //采集通道B
#define PORT_TEMP 0 //采集温度
#define PORT_JUMP 0 //内短采集
#define PACK_NUM 1 //一次采集的数据包数量
#define FILTER_NUM 0 //滤波数
typedef enum{
CS1238_STATUS_IDLE,
CS1238_STATUS_START,
CS1238_STATUS_DELAY,
CS1238_STATUS_READ,
CS1238_STATUS_WAIT_READ,
CS1238_STATUS_CH_SEL,
CS1238_STATUS_STOP,
}CS1238Status_m;
LUCS1237_STATUS_IDLE,
LUCS1237_STATUS_START,
LUCS1237_STATUS_DELAY,
LUCS1237_STATUS_READ,
LUCS1237_STATUS_WAIT_READ,
LUCS1237_STATUS_CH_SEL,
LUCS1237_STATUS_STOP,
}LeftUpCS1237Status_m;
typedef struct{
CS1238Status_m Status;
uint32_t CS1238Delay1mSCnt;
LeftUpCS1237Status_m Status;
uint32_t CS1237Delay1mSCnt;
int32_t Ain1_AD;//AIN1ad数据
int32_t Ain2_AD;//AIN2ad数据
int32_t AinA_AD;//AINAad数据
//int32_t AinB_AD;//AINBad数据
int32_t Temp_AD;//温度ad数据
int32_t Jump_AD;//内短ad数据
}
CS1238Var_t;
extern CS1238Var_t CS1238Var;
LEFTUP_CS1237Var_t;
void CS1238_Init(void);
void CS1238_IrqCallBack(void);
void CS1238DataLoopCollect(void);
void CS1238LoopHandler(void);
void CS12381mSRoutine(void);
void CS1238Start(void);
void CS1238Stop(void);
void LEFTUP_CS1237_Init(void);
void LEFTUP_CS1237_IrqCallBack(void);
void LEFTUP_CS1237DataLoopCollect(void);
void LEFTUP_CS12371mSRoutine(void);
void LEFTUP_CS1237Start(void);
void LEFTUP_CS1237Stop(void);
#endif
@@ -1,485 +0,0 @@
#include "CS1238.h"
#include "UartDebug.h"
#include "bsp.h"
#include "main.h"
#include "Algorithm.h"
CS1238Var_t CS1238Var;
static bool InitFlag;
static bool CS1238IrqFlag;
static bool BuildDelay;
static uint8_t CS1238Port;
static uint8_t CS1238Hz;
static uint8_t CS1238PGA;
extern void CS1238Ain1DataProcessCallBack(int32_t AD);
extern void CS1238Ain2DataProcessCallBack(int32_t AD);
extern void CS1238TempDataProcessCallBack(int32_t AD);
extern void CS1238JumpDataProcessCallBack(int32_t AD);
/** cs1238 时序时钟*/
static void CS1238_Clock(void)
{
CS1238_SCLK_H();
CS1238_100NS(3);
CS1238_SCLK_L();
CS1238_100NS(3);
}
/** cs1238 休眠*/
static void CS1238_Sleep(void)
{
CS1238_SCLK_H();
CS1238_1US(150);
}
/** cs1238 唤醒*/
static void CS1238_WakeUp(void)
{
CS1238_SCLK_L();
CS1238_1US(20);
}
/**设置CS1238寄存器*/
static void Set_CS1238_Config(uint8_t ad_reg)
{
uint16_t bit_cout = 0;
uint8_t reg_temp = 0x00;
//DOUT由高变低之后开始读取数据
CS1238_DOUT_OUT();
CS1238_DOUT_H();
CS1238_DOUT_IN();
CS1238_SCLK_L(); //时钟拉低
CS1238Var.CS1238Delay1mSCnt = 300;
CS1238IrqFlag = false;
while(CS1238IrqFlag == false) //等待芯片准备好
{
if(CS1238Var.CS1238Delay1mSCnt <= 0){
DBG_LOG("CS1238 Preparation Timeout...\r\n");
return; // 超时退出
}
}
CS1238IntDisable();
CS1238IrqFlag = false;
/* clk1-clk26 写期间不需要操作*/
for (bit_cout = 0; bit_cout < 26; bit_cout++)
{
CS1238_Clock(); //给一周期时钟
}
/* clk27 DOUT输出拉高*/
CS1238_Clock(); //给一周期时钟
CS1238_DOUT_H();
/* clk28 - clk29 发送写寄存器命令字 */
CS1238_Clock(); //给一周期时钟
CS1238_Clock(); //给一周期时钟
/* clk30 - clk36 发送写寄存器命令字 */
CS1238_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
{
CS1238_DOUT_H();
}
else
{
CS1238_DOUT_L();
}
reg_temp = reg_temp << 1;
CS1238_Clock();
}
/* clk37写寄存器模式还是输出 */
CS1238_Clock();
/* clk38 ~ clk45 写入寄存器值 */
reg_temp = ad_reg;//要配件的寄存器数值
for (bit_cout = 0; bit_cout < 8; bit_cout++)
{
if (reg_temp & 0x80) //MSB
{
CS1238_DOUT_H();
}
else
{
CS1238_DOUT_L();
}
reg_temp = reg_temp << 1;
CS1238_Clock();
}
/* 8: clk46 */
CS1238_Clock();
CS1238_DOUT_H();
CS1238_DOUT_IN();
CS1238IntEnable();
return ;
}
/**读CS1238寄存器*/
static int32_t Read_CS1238_Config(void)
{
uint16_t bit_cout = 0;
uint8_t reg_temp = 0x00;
//DOUT由高变低之后开始读取数据
CS1238_DOUT_OUT();
CS1238_DOUT_H();
CS1238_DOUT_IN();
CS1238_SCLK_L(); //时钟拉低
CS1238Var.CS1238Delay1mSCnt = 300;
CS1238IrqFlag = false;
while(CS1238IrqFlag == false) //等待芯片准备好
{
if(CS1238Var.CS1238Delay1mSCnt <= 0){
DBG_LOG("CS1238 Preparation Timeout...\r\n");
return 0; // 超时退出
}
}
CS1238IntDisable();
CS1238IrqFlag = false;
/* clk1-clk26 写期间不需要操作*/
for (bit_cout = 0; bit_cout < 26; bit_cout++)
{
CS1238_Clock(); //给一周期时钟
}
/* clk27 DOUT输出拉高*/
CS1238_Clock(); //给一周期时钟
CS1238_DOUT_H();
/* clk28 - clk29 发送写寄存器命令字 */
CS1238_Clock(); //给一周期时钟
CS1238_Clock(); //给一周期时钟
/* clk30 - clk36 发送读寄存器命令字 */
CS1238_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
{
CS1238_DOUT_H();
}
else
{
CS1238_DOUT_L();
}
reg_temp = reg_temp << 1;
CS1238_Clock();
}
/* clk37,读寄存器模式改输入 */
CS1238_Clock();
CS1238_DOUT_IN();
for (bit_cout = 0; bit_cout < 8; bit_cout++)
{
CS1238_SCLK_H();
reg_temp <<= 1; //左移1位准备接受数据 初始默认0
CS1238_100NS(3);//延时300ns
if(GET_CS1238_DOUT() == true) //有数值则累加
reg_temp |= 1;
CS1238_SCLK_L();
CS1238_100NS(3);
}
/* 8: clk46 */
CS1238_Clock();
CS1238_DOUT_IN();
CS1238_DOUT_H();
CS1238IntEnable();
return reg_temp ;
}
/**读取CS1238的AD数*/
static int32_t Read_CS1238_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++)
{
CS1238_SCLK_H();
data_temp <<= 1; //左移1位准备接受数据 初始默认0
CS1238_100NS(3);//延时300ns
if(GET_CS1238_DOUT() == true) //有数值则累加
data_temp |= 1;
CS1238_SCLK_L();
CS1238_100NS(3);
}
/* clk25 ~ clk27 */
for (bit_cout = 24; bit_cout < 27; bit_cout++)
{
CS1238_Clock(); //给一周期时钟
}
CS1238_DOUT_H();
CS1238_SCLK_L();
if(data_temp > 0x7FFFFF) //取24位
{
data_temp |= 0xFF000000;
}
return data_temp;
}
void CS1238_IrqCallBack(void)
{
CS1238IrqFlag = true;
}
void CS1238_Init(void)
{
CS1238IrqFlag = false;
BuildDelay = false;
CS1238IntEnable();
CS1238Var.Ain1_AD = 0;
CS1238Var.Ain2_AD = 0;
CS1238Var.Temp_AD = 0;
CS1238Var.Jump_AD = 0;
CS1238Port = CH_SEL_A;
CS1238Hz = SPEED_SEL_640Hz;
CS1238PGA = PGA_SEL_128;
uint8_t read_reg = 0x00;
uint8_t set_reg = REFO_ON | CS1238Hz | CS1238PGA | CS1238Port;
CS1238_1MS(20);
Set_CS1238_Config(set_reg);
CS1238_1MS(20);
read_reg = Read_CS1238_Config();
CS1238_1MS(20);
if(read_reg != set_reg){
DBG_LOG("CS1238 Init ERR...\r\n");
DBG_LOG("set_reg = %02X\tread_reg = %02X\r\n",set_reg,read_reg);
InitFlag = false;
}
else {
DBG_LOG("CS1238 Init OK...\r\n");
//DBG_LOG("set_reg = %02X\tread_reg = %02X\r\n",set_reg,read_reg);
CS1238Port = read_reg & 0x03;
InitFlag = true;
}
}
void CS1238DataLoopCollect(void)
{
static int32_t ad_array[PACK_NUM];
static uint8_t adcnt;
static uint8_t TimeOutmagcnt;
switch(CS1238Var.Status) {
case CS1238_STATUS_IDLE:{
break;}
case CS1238_STATUS_START:{
memset(&ad_array, 0x00, sizeof(ad_array));
adcnt = 0;
TimeOutmagcnt = 0;
memset(&CS1238Var, NULL, sizeof(CS1238Var));
if(BuildDelay == true)
{
BuildDelay = false;
if(CS1238Hz == SPEED_SEL_10Hz){
CS1238Var.CS1238Delay1mSCnt = tCon_10Hz;
}
if(CS1238Hz == SPEED_SEL_40Hz){
CS1238Var.CS1238Delay1mSCnt = tCon_40Hz;
}
if(CS1238Hz == SPEED_SEL_640Hz){
CS1238Var.CS1238Delay1mSCnt = tCon_640Hz;
}
if(CS1238Hz == SPEED_SEL6_1280Hz){
CS1238Var.CS1238Delay1mSCnt = tCon_1280Hz;
}
CS1238Var.Status = CS1238_STATUS_DELAY;
}
else
{
CS1238Var.Status = CS1238_STATUS_READ;
}
break;}
case CS1238_STATUS_DELAY:{
if(CS1238Var.CS1238Delay1mSCnt <= 0){
CS1238Var.Status = CS1238_STATUS_READ;
}
break;}
case CS1238_STATUS_READ:{
CS1238IrqFlag = false;
CS1238Var.CS1238Delay1mSCnt = 100;
CS1238Var.Status = CS1238_STATUS_WAIT_READ;
break;}
case CS1238_STATUS_WAIT_READ:{
if(CS1238Var.CS1238Delay1mSCnt <= 0){
CS1238Var.Status = CS1238_STATUS_READ;
TimeOutmagcnt++;
}
if(CS1238IrqFlag == true){
CS1238IrqFlag = false;
ad_array[adcnt++] = Read_CS1238_Ad_Data();
CS1238Var.Status = CS1238_STATUS_READ;
}
if(TimeOutmagcnt >= PACK_NUM){
TimeOutmagcnt = 0;
if(adcnt > 0){
if(CS1238Port == CH_SEL_A){
CS1238Var.Ain1_AD = IntFilter_32t(ad_array, adcnt, 4);
CS1238Ain1DataProcessCallBack(CS1238Var.Ain1_AD);
}
if(CS1238Port == CH_SEL_B){
CS1238Var.Ain2_AD = IntFilter_32t(ad_array, adcnt, 4);
CS1238Ain2DataProcessCallBack(CS1238Var.Ain2_AD);
}
if(CS1238Port == CH_SEL_TEMP){
CS1238Var.Temp_AD = IntFilter_32t(ad_array, adcnt, 4);
CS1238TempDataProcessCallBack(CS1238Var.Temp_AD);
}
if(CS1238Port == CH_SEL_JUMP){
CS1238Var.Jump_AD = IntFilter_32t(ad_array, adcnt, 4);
CS1238JumpDataProcessCallBack(CS1238Var.Jump_AD);
}
CS1238Var.Status = CS1238_STATUS_CH_SEL;
}
else{
if(CS1238Port == CH_SEL_A){
DBG_LOG("CS1238 CHA TimeOut...\r\n");
}
if(CS1238Port == CH_SEL_B){
DBG_LOG("CS1238 CHB TimeOut...\r\n");
}
if(CS1238Port == CH_SEL_TEMP){
DBG_LOG("CS1238 Temp TimeOut...\r\n");
}
if(CS1238Port == CH_SEL_JUMP){
DBG_LOG("CS1238 Jump TimeOut...\r\n");
}
CS1238Var.Status = CS1238_STATUS_CH_SEL;
}
}
if(adcnt >= PACK_NUM){
if(CS1238Port == CH_SEL_A){
CS1238Var.Ain1_AD = IntFilter_32t(ad_array, adcnt, 4);
CS1238Ain1DataProcessCallBack(CS1238Var.Ain1_AD);
}
if(CS1238Port == CH_SEL_B){
CS1238Var.Ain2_AD = IntFilter_32t(ad_array, adcnt, 4);
CS1238Ain2DataProcessCallBack(CS1238Var.Ain2_AD);
}
if(CS1238Port == CH_SEL_TEMP){
CS1238Var.Temp_AD = IntFilter_32t(ad_array, adcnt, 4);
CS1238TempDataProcessCallBack(CS1238Var.Temp_AD);
}
if(CS1238Port == CH_SEL_JUMP){
CS1238Var.Jump_AD = IntFilter_32t(ad_array, adcnt, 4);
CS1238JumpDataProcessCallBack(CS1238Var.Jump_AD);
}
CS1238Var.Status = CS1238_STATUS_CH_SEL;
}
break;}
case CS1238_STATUS_CH_SEL:{
CS1238Var.Status = CS1238_STATUS_STOP;
BuildDelay = false;
uint8_t read_reg;
if(CS1238Port == CH_SEL_A){
#if(PORT_TEMP == 1)
read_reg = Read_CS1238_Config();
Set_CS1238_Config((read_reg & 0xFC) | CH_SEL_TEMP);
CS1238Port = CH_SEL_TEMP;
BuildDelay = true;
break;
#endif
#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(CS1238Port == CH_SEL_B){
#if(PORT_TEMP == 1)
read_reg = Read_CS1238_Config();
Set_CS1238_Config((read_reg & 0xFC) | CH_SEL_TEMP);
CS1238Port = CH_SEL_TEMP;
BuildDelay = true;
break;
#endif
#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_CS1238_Config();
Set_CS1238_Config((read_reg & 0xFC) | CH_SEL_A);
CS1238Port = CH_SEL_A;
BuildDelay = true;
break;
#endif
}
if(CS1238Port == 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_CS1238_Config();
Set_CS1238_Config((read_reg & 0xFC) | CH_SEL_A);
CS1238Port = CH_SEL_A;
BuildDelay = true;
break;
#endif
}
if(CS1238Port == CH_SEL_JUMP){
#if(PORT_A == 1)
read_reg = Read_CS1238_Config();
Set_CS1238_Config((read_reg & 0xFC) | CH_SEL_A);
CS1238Port = CH_SEL_A;
BuildDelay = true;
break;
#endif
#if(PORT_TEMP == 1)
read_reg = Read_CS1238_Config();
Set_CS1238_Config((read_reg & 0xFC) | CH_SEL_TEMP);
CS1238Port = CH_SEL_TEMP;
BuildDelay = true;
break;
#endif
}
break;}
case CS1238_STATUS_STOP:{
//CS1238Stop();
//CS1238Var.Status = CS1238_STATUS_IDLE;
CS1238Var.Status = CS1238_STATUS_START;//持续工作
break;}
}
}
void CS12381mSRoutine(void)
{
if(CS1238Var.CS1238Delay1mSCnt > 0)
CS1238Var.CS1238Delay1mSCnt--;
}
void CS1238Start(void)
{
CS1238_WakeUp();
CS1238_1MS(2);
BuildDelay = true;
CS1238IntEnable();
if(!InitFlag){
CS1238_Init();
return;
}
CS1238Var.Status = CS1238_STATUS_START;
}
void CS1238Stop(void)
{
CS1238IntDisable();
CS1238_Sleep();
}
@@ -1,91 +0,0 @@
#include "bsp.h"
#ifndef _CS1238_H_
#define _CS1238_H_
#define READ_CONFIG_CMD 0x56
#define WRITE_CONFIG_CMD 0x65
#define CONFIG_RST 0x0C
#define REFO_OFF 0x40
#define REFO_ON 0x00
#define SPEED_SEL_10Hz 0x00
#define SPEED_SEL_40Hz 0x10
#define SPEED_SEL_640Hz 0x20
#define SPEED_SEL6_1280Hz 0x30
#define PGA_SEL_1 0x00
#define PGA_SEL_2 0x04
#define PGA_SEL_64 0x08
#define PGA_SEL_128 0x0C
#define CH_SEL_A 0x00
#define CH_SEL_B 0x01
#define CH_SEL_TEMP 0x02
#define CH_SEL_JUMP 0x03
#define CS1238_DOUT_OUT() SetBit(((uint32_t)&M0P_GPIO->PADIR + CS1238_DOUT_PORTx), CS1238_DOUT_PINx, 0)
#define CS1238_DOUT_IN() SetBit(((uint32_t)&M0P_GPIO->PADIR + CS1238_DOUT_PORTx), CS1238_DOUT_PINx, 1)
#define CS1238_DOUT_H() SET_CS1238_DOUT()
#define CS1238_DOUT_L() CLR_CS1238_DOUT()
#define CS1238_SCLK_H() SET_CS1238_SCLK()
#define CS1238_SCLK_L() CLR_CS1238_SCLK()
#define CS1238_1US(x) delay_us(x) //1us延时
#define CS1238_100NS(x) delay_ns(x) //100ns延时
#define CS1238_1MS(x) delay_ms(x) //1ms延时
/*Definition of conversion time corresponding to repeatability setting*/
/*
10Hz //建立时间300ms
40Hz //建立时间75ms
640Hz //建立时间6.25ms
1280Hz //建立时间3.125ms
*/
#define tCon_10Hz 300 /* ms. */
#define tCon_40Hz 75 /* ms. */
#define tCon_640Hz 7 /* ms. */
#define tCon_1280Hz 4 /* ms. */
#define PORT_A 1 //采集通道A
#define PORT_B 1 //采集通道B
#define PORT_TEMP 0 //采集温度
#define PORT_JUMP 0 //内短采集
#define PACK_NUM 10 //一次采集的数据包数量
typedef enum{
CS1238_STATUS_IDLE,
CS1238_STATUS_START,
CS1238_STATUS_DELAY,
CS1238_STATUS_READ,
CS1238_STATUS_WAIT_READ,
CS1238_STATUS_CH_SEL,
CS1238_STATUS_STOP,
}CS1238Status_m;
typedef struct{
CS1238Status_m Status;
uint32_t CS1238Delay1mSCnt;
int32_t Ain1_AD;//AIN1ad数据
int32_t Ain2_AD;//AIN2ad数据
int32_t Temp_AD;//温度ad数据
int32_t Jump_AD;//内短ad数据
}
CS1238Var_t;
extern CS1238Var_t CS1238Var;
void CS1238_Init(void);
void CS1238_IrqCallBack(void);
void CS1238DataLoopCollect(void);
void CS1238LoopHandler(void);
void CS12381mSRoutine(void);
void CS1238Start(void);
void CS1238Stop(void);
#endif
@@ -0,0 +1,464 @@
#include "CS1237_RIGHTLOW.h"
#include "Debug.h"
#include "bsp.h"
#include "main.h"
#include "Algorithm.h"
#define CS1237_DOUT_OUT() PORT_OE(RIGHTLOW_CS1237_DOUT_PORTx, RIGHTLOW_CS1237_DOUT_PINx, Enable)
#define CS1237_DOUT_IN() PORT_OE(RIGHTLOW_CS1237_DOUT_PORTx, RIGHTLOW_CS1237_DOUT_PINx, Disable)
#define CS1237_DOUT_H() SET_RIGHTLOW_CS1237_DOUT()
#define CS1237_DOUT_L() CLR_RIGHTLOW_CS1237_DOUT()
#define CS1237_DOUT_GET() GET_RIGHTLOW_CS1237_DOUT()
#define CS1237_SCLK_H() SET_RIGHTLOW_CS1237_SCLK()
#define CS1237_SCLK_L() CLR_RIGHTLOW_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() ExtInt06IntEnable()
#define CS1237IntDisable() ExtInt06IntDisable()
RIGHTLOW_CS1237Var_t RIGHTLOW_CS1237Var;
static bool InitFlag;
static bool CS1237IrqFlag;
static bool BuildDelay;
static uint8_t CS1237Port;
static uint8_t CS1237Hz;
static uint8_t CS1237PGA;
extern void RIGHTLOW_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(); //时钟拉低
RIGHTLOW_CS1237Var.CS1237Delay1mSCnt = 300;
CS1237IrqFlag = false;
while(CS1237IrqFlag == false) //等待芯片准备好
{
if(RIGHTLOW_CS1237Var.CS1237Delay1mSCnt <= 0){
//DBG_LOG("RIGHTLOW 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(); //时钟拉低
RIGHTLOW_CS1237Var.CS1237Delay1mSCnt = 300;
CS1237IrqFlag = false;
while(CS1237IrqFlag == false) //等待芯片准备好
{
if(RIGHTLOW_CS1237Var.CS1237Delay1mSCnt <= 0){
//DBG_LOG("RIGHTLOW 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 RIGHTLOW_CS1237_IrqCallBack(void)
{
CS1237IrqFlag = true;
}
void RIGHTLOW_CS1237_Init(void)
{
CS1237IrqFlag = false;
BuildDelay = false;
RIGHTLOW_CS1237Var.AinA_AD = 0;
RIGHTLOW_CS1237Var.Temp_AD = 0;
RIGHTLOW_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("RIGHTLOW CS1237 Init ERR...\r\n");
//DBG_LOG("set_reg = %02X\tread_reg = %02X\r\n",set_reg,read_reg);
InitFlag = true;
}
else {
DBG_LOG("RIGHTLOW 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 RIGHTLOW_CS1237DataLoopCollect(void)
{
static int32_t ad_array[PACK_NUM];
static uint8_t adcnt;
static uint8_t TimeOutmagcnt;
switch(RIGHTLOW_CS1237Var.Status) {
case RLCS1237_STATUS_IDLE:{
break;}
case RLCS1237_STATUS_START:{
memset(&ad_array, 0x00, sizeof(ad_array));
adcnt = 0;
TimeOutmagcnt = 0;
memset(&RIGHTLOW_CS1237Var, NULL, sizeof(RIGHTLOW_CS1237Var));
if(BuildDelay == true)
{
BuildDelay = false;
if(CS1237Hz == SPEED_SEL_10Hz){
RIGHTLOW_CS1237Var.CS1237Delay1mSCnt = tCon_10Hz;
}
if(CS1237Hz == SPEED_SEL_40Hz){
RIGHTLOW_CS1237Var.CS1237Delay1mSCnt = tCon_40Hz;
}
if(CS1237Hz == SPEED_SEL_640Hz){
RIGHTLOW_CS1237Var.CS1237Delay1mSCnt = tCon_640Hz;
}
if(CS1237Hz == SPEED_SEL6_1280Hz){
RIGHTLOW_CS1237Var.CS1237Delay1mSCnt = tCon_1280Hz;
}
RIGHTLOW_CS1237Var.Status = RLCS1237_STATUS_DELAY;
}
else
{
RIGHTLOW_CS1237Var.Status = RLCS1237_STATUS_READ;
}
break;}
case RLCS1237_STATUS_DELAY:{
if(RIGHTLOW_CS1237Var.CS1237Delay1mSCnt <= 0){
RIGHTLOW_CS1237Var.Status = RLCS1237_STATUS_READ;
}
break;}
case RLCS1237_STATUS_READ:{
CS1237IrqFlag = false;
RIGHTLOW_CS1237Var.CS1237Delay1mSCnt = 100;
RIGHTLOW_CS1237Var.Status = RLCS1237_STATUS_WAIT_READ;
break;}
case RLCS1237_STATUS_WAIT_READ:{
if(RIGHTLOW_CS1237Var.CS1237Delay1mSCnt <= 0){
RIGHTLOW_CS1237Var.Status = RLCS1237_STATUS_READ;
TimeOutmagcnt++;
}
if(CS1237IrqFlag == true){
CS1237IrqFlag = false;
ad_array[adcnt++] = Read_CS1237_Ad_Data();
RIGHTLOW_CS1237Var.Status = RLCS1237_STATUS_READ;
}
if(TimeOutmagcnt >= PACK_NUM){
TimeOutmagcnt = 0;
if(adcnt > 0){
if(CS1237Port == CH_SEL_A){
RIGHTLOW_CS1237Var.AinA_AD = IntFilter_32t(ad_array, adcnt, FILTER_NUM);
RIGHTLOW_CS1237AinADataProcessCallBack(RIGHTLOW_CS1237Var.AinA_AD);
}
if(CS1237Port == CH_SEL_TEMP){
RIGHTLOW_CS1237Var.Temp_AD = IntFilter_32t(ad_array, adcnt, FILTER_NUM);
//CS1237TempDataProcessCallBack(LEFTLOW_CS1237Var.Temp_AD);
}
if(CS1237Port == CH_SEL_JUMP){
RIGHTLOW_CS1237Var.Jump_AD = IntFilter_32t(ad_array, adcnt, FILTER_NUM);
//CS1237JumpDataProcessCallBack(LEFTLOW_CS1237Var.Jump_AD);
}
RIGHTLOW_CS1237Var.Status = RLCS1237_STATUS_CH_SEL;
}
else{
if(CS1237Port == CH_SEL_A){
DBG_LOG("RIGHTLOW CS1237 CHA TimeOut...\r\n");
}
if(CS1237Port == CH_SEL_TEMP){
DBG_LOG("RIGHTLOW CS1237 Temp TimeOut...\r\n");
}
if(CS1237Port == CH_SEL_JUMP){
DBG_LOG("RIGHTLOW CS1237 Jump TimeOut...\r\n");
}
RIGHTLOW_CS1237Var.Status = RLCS1237_STATUS_CH_SEL;
}
}
if(adcnt >= PACK_NUM){
if(CS1237Port == CH_SEL_A){
RIGHTLOW_CS1237Var.AinA_AD = IntFilter_32t(ad_array, adcnt, FILTER_NUM);
RIGHTLOW_CS1237AinADataProcessCallBack(RIGHTLOW_CS1237Var.AinA_AD);
}
if(CS1237Port == CH_SEL_TEMP){
RIGHTLOW_CS1237Var.Temp_AD = IntFilter_32t(ad_array, adcnt, FILTER_NUM);
//CS1237TempDataProcessCallBack(LEFTLOW_CS1237Var.Temp_AD);
}
if(CS1237Port == CH_SEL_JUMP){
RIGHTLOW_CS1237Var.Jump_AD = IntFilter_32t(ad_array, adcnt, FILTER_NUM);
//CS1237JumpDataProcessCallBack(LEFTLOW_CS1237Var.Jump_AD);
}
RIGHTLOW_CS1237Var.Status = RLCS1237_STATUS_CH_SEL;
}
break;}
case RLCS1237_STATUS_CH_SEL:{
RIGHTLOW_CS1237Var.Status = RLCS1237_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 RLCS1237_STATUS_STOP:{
RIGHTLOW_CS1237Stop();
RIGHTLOW_CS1237Var.Status = RLCS1237_STATUS_IDLE;
//RIGHTLOW_CS1237Var.Status = RLCS1237_STATUS_START;//持续工作
break;}
}
}
void RIGHTLOW_CS12371mSRoutine(void)
{
if(RIGHTLOW_CS1237Var.CS1237Delay1mSCnt > 0)
RIGHTLOW_CS1237Var.CS1237Delay1mSCnt--;
}
void RIGHTLOW_CS1237Start(void)
{
CS1237_WakeUp();
CS1237_1MS(2);
BuildDelay = true;
CS1237IntEnable();
if(!InitFlag){
RIGHTLOW_CS1237_Init();
return;
}
RIGHTLOW_CS1237Var.Status = RLCS1237_STATUS_START;
}
void RIGHTLOW_CS1237Stop(void)
{
CS1237IntDisable();
//CS1237_Sleep();
}
@@ -0,0 +1,78 @@
#include "bsp.h"
#ifndef _CS1237_RIGHTLOW_H_
#define _CS1237_RIGHTLOW_H_
#define READ_CONFIG_CMD 0x56
#define WRITE_CONFIG_CMD 0x65
#define CONFIG_RST 0x0C
#define REFO_OFF 0x40
#define REFO_ON 0x00
#define SPEED_SEL_10Hz 0x00
#define SPEED_SEL_40Hz 0x10
#define SPEED_SEL_640Hz 0x20
#define SPEED_SEL6_1280Hz 0x30
#define PGA_SEL_1 0x00
#define PGA_SEL_2 0x04
#define PGA_SEL_64 0x08
#define PGA_SEL_128 0x0C
#define CH_SEL_A 0x00
//#define CH_SEL_B 0x01
#define CH_SEL_TEMP 0x02
#define CH_SEL_JUMP 0x03
/*Definition of conversion time corresponding to repeatability setting*/
/*
10Hz //建立时间300ms
40Hz //建立时间75ms
640Hz //建立时间6.25ms
1280Hz //建立时间3.125ms
*/
#define tCon_10Hz 300 /* ms. */
#define tCon_40Hz 75 /* ms. */
#define tCon_640Hz 7 /* ms. */
#define tCon_1280Hz 4 /* ms. */
#define PORT_A 1 //采集通道A
//#define PORT_B 1 //采集通道B
#define PORT_TEMP 0 //采集温度
#define PORT_JUMP 0 //内短采集
#define PACK_NUM 1 //一次采集的数据包数量
#define FILTER_NUM 0 //滤波数
typedef enum{
RLCS1237_STATUS_IDLE,
RLCS1237_STATUS_START,
RLCS1237_STATUS_DELAY,
RLCS1237_STATUS_READ,
RLCS1237_STATUS_WAIT_READ,
RLCS1237_STATUS_CH_SEL,
RLCS1237_STATUS_STOP,
}RightLowCS1237Status_m;
typedef struct{
RightLowCS1237Status_m Status;
uint32_t CS1237Delay1mSCnt;
int32_t AinA_AD;//AINAad数据
//int32_t AinB_AD;//AINBad数据
int32_t Temp_AD;//温度ad数据
int32_t Jump_AD;//内短ad数据
}
RIGHTLOW_CS1237Var_t;
void RIGHTLOW_CS1237_Init(void);
void RIGHTLOW_CS1237_IrqCallBack(void);
void RIGHTLOW_CS1237DataLoopCollect(void);
void RIGHTLOW_CS12371mSRoutine(void);
void RIGHTLOW_CS1237Start(void);
void RIGHTLOW_CS1237Stop(void);
#endif
@@ -1,189 +1,203 @@
#include "CS1238.h"
#include "UartDebug.h"
#include "CS1237_RIGHTUP.h"
#include "Debug.h"
#include "bsp.h"
#include "main.h"
#include "Algorithm.h"
CS1238Var_t CS1238Var;
static bool InitFlag;
static bool CS1238IrqFlag;
static bool BuildDelay;
static uint8_t CS1238Port;
static uint8_t CS1238Hz;
static uint8_t CS1238PGA;
extern void CS1238Ain1DataProcessCallBack(int32_t AD);
extern void CS1238Ain2DataProcessCallBack(int32_t AD);
extern void CS1238TempDataProcessCallBack(int32_t AD);
extern void CS1238JumpDataProcessCallBack(int32_t AD);
#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()
/** cs1238 时序时钟*/
static void CS1238_Clock(void)
#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)
{
CS1238_SCLK_H();
CS1238_100NS(3);
CS1238_SCLK_L();
CS1238_100NS(3);
CS1237_SCLK_H();
CS1237_5NS(60);
CS1237_SCLK_L();
CS1237_5NS(60);
}
/** cs1238 休眠*/
static void CS1238_Sleep(void)
/** cs1237 休眠*/
static void CS1237_Sleep(void)
{
CS1238_SCLK_H();
CS1238_1US(150);
CS1237_SCLK_H();
CS1237_1US(200);
}
/** cs1238 唤醒*/
static void CS1238_WakeUp(void)
/** cs1237 唤醒*/
static void CS1237_WakeUp(void)
{
CS1238_SCLK_L();
CS1238_1US(20);
CS1237_SCLK_L();
CS1237_1US(20);
}
/**设置CS1238寄存器*/
static void Set_CS1238_Config(uint8_t ad_reg)
/**设置CS1237寄存器*/
static void Set_CS1237_Config(uint8_t ad_reg)
{
uint16_t bit_cout = 0;
uint8_t reg_temp = 0x00;
//DOUT由高变低之后开始读取数据
CS1238_DOUT_OUT();
CS1238_DOUT_H();
CS1238_DOUT_IN();
CS1238_SCLK_L(); //时钟拉低
CS1238Var.CS1238Delay1mSCnt = 300;
CS1238IrqFlag = false;
while(CS1238IrqFlag == false) //等待芯片准备好
CS1237_DOUT_OUT();
CS1237_DOUT_H();
CS1237_DOUT_IN();
CS1237_SCLK_L(); //时钟拉低
RIGHTUP_CS1237Var.CS1237Delay1mSCnt = 300;
CS1237IrqFlag = false;
while(CS1237IrqFlag == false) //等待芯片准备好
{
if(CS1238Var.CS1238Delay1mSCnt <= 0){
DBG_LOG("CS1238 Preparation Timeout...\r\n");
if(RIGHTUP_CS1237Var.CS1237Delay1mSCnt <= 0){
//DBG_LOG("RIGHTUP CS1237 Preparation Timeout...\r\n");
return; // 超时退出
}
}
CS1238IntDisable();
CS1238IrqFlag = false;
CS1237IntDisable();
CS1237IrqFlag = false;
/* clk1-clk26 写期间不需要操作*/
for (bit_cout = 0; bit_cout < 26; bit_cout++)
{
CS1238_Clock(); //给一周期时钟
CS1237_Clock(); //给一周期时钟
}
/* clk27 DOUT输出拉高*/
CS1238_Clock(); //给一周期时钟
CS1238_DOUT_H();
CS1237_Clock(); //给一周期时钟
CS1237_DOUT_H();
/* clk28 - clk29 发送写寄存器命令字 */
CS1238_Clock(); //给一周期时钟
CS1238_Clock(); //给一周期时钟
CS1237_Clock(); //给一周期时钟
CS1237_Clock(); //给一周期时钟
/* clk30 - clk36 发送写寄存器命令字 */
CS1238_DOUT_OUT();
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
{
CS1238_DOUT_H();
CS1237_DOUT_H();
}
else
{
CS1238_DOUT_L();
CS1237_DOUT_L();
}
reg_temp = reg_temp << 1;
CS1238_Clock();
CS1237_Clock();
}
/* clk37写寄存器模式还是输出 */
CS1238_Clock();
CS1237_Clock();
/* clk38 ~ clk45 写入寄存器值 */
reg_temp = ad_reg;//要配件的寄存器数值
for (bit_cout = 0; bit_cout < 8; bit_cout++)
{
if (reg_temp & 0x80) //MSB
{
CS1238_DOUT_H();
CS1237_DOUT_H();
}
else
{
CS1238_DOUT_L();
CS1237_DOUT_L();
}
reg_temp = reg_temp << 1;
CS1238_Clock();
CS1237_Clock();
}
/* 8: clk46 */
CS1238_Clock();
CS1238_DOUT_H();
CS1238_DOUT_IN();
CS1238IntEnable();
CS1237_Clock();
CS1237_DOUT_H();
CS1237_DOUT_IN();
CS1237IntEnable();
return ;
}
/**读CS1238寄存器*/
static int32_t Read_CS1238_Config(void)
/**读CS1237寄存器*/
static int32_t Read_CS1237_Config(void)
{
uint16_t bit_cout = 0;
uint8_t reg_temp = 0x00;
//DOUT由高变低之后开始读取数据
CS1238_DOUT_OUT();
CS1238_DOUT_H();
CS1238_DOUT_IN();
CS1238_SCLK_L(); //时钟拉低
CS1238Var.CS1238Delay1mSCnt = 300;
CS1238IrqFlag = false;
while(CS1238IrqFlag == false) //等待芯片准备好
CS1237_DOUT_OUT();
CS1237_DOUT_H();
CS1237_DOUT_IN();
CS1237_SCLK_L(); //时钟拉低
RIGHTUP_CS1237Var.CS1237Delay1mSCnt = 300;
CS1237IrqFlag = false;
while(CS1237IrqFlag == false) //等待芯片准备好
{
if(CS1238Var.CS1238Delay1mSCnt <= 0){
DBG_LOG("CS1238 Preparation Timeout...\r\n");
if(RIGHTUP_CS1237Var.CS1237Delay1mSCnt <= 0){
//DBG_LOG("RIGHTUP CS1237 Preparation Timeout...\r\n");
return 0; // 超时退出
}
}
CS1238IntDisable();
CS1238IrqFlag = false;
CS1237IntDisable();
CS1237IrqFlag = false;
/* clk1-clk26 写期间不需要操作*/
for (bit_cout = 0; bit_cout < 26; bit_cout++)
{
CS1238_Clock(); //给一周期时钟
CS1237_Clock(); //给一周期时钟
}
/* clk27 DOUT输出拉高*/
CS1238_Clock(); //给一周期时钟
CS1238_DOUT_H();
CS1237_Clock(); //给一周期时钟
CS1237_DOUT_H();
/* clk28 - clk29 发送写寄存器命令字 */
CS1238_Clock(); //给一周期时钟
CS1238_Clock(); //给一周期时钟
CS1237_Clock(); //给一周期时钟
CS1237_Clock(); //给一周期时钟
/* clk30 - clk36 发送读寄存器命令字 */
CS1238_DOUT_OUT();
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
{
CS1238_DOUT_H();
CS1237_DOUT_H();
}
else
{
CS1238_DOUT_L();
CS1237_DOUT_L();
}
reg_temp = reg_temp << 1;
CS1238_Clock();
CS1237_Clock();
}
/* clk37,读寄存器模式改输入 */
CS1238_Clock();
CS1238_DOUT_IN();
CS1237_Clock();
CS1237_DOUT_IN();
for (bit_cout = 0; bit_cout < 8; bit_cout++)
{
CS1238_SCLK_H();
CS1237_SCLK_H();
reg_temp <<= 1; //左移1位准备接受数据 初始默认0
CS1238_100NS(3);//延时300ns
if(GET_CS1238_DOUT() == true) //有数值则累加
CS1237_5NS(60);//延时300ns
if(CS1237_DOUT_GET() == true) //有数值则累加
reg_temp |= 1;
CS1238_SCLK_L();
CS1238_100NS(3);
CS1237_SCLK_L();
CS1237_5NS(60);
}
/* 8: clk46 */
CS1238_Clock();
CS1238_DOUT_IN();
CS1238_DOUT_H();
CS1238IntEnable();
CS1237_Clock();
CS1237_DOUT_IN();
CS1237_DOUT_H();
CS1237IntEnable();
return reg_temp ;
}
/**读取CS1238的AD数*/
static int32_t Read_CS1238_Ad_Data(void)
/**读取CS1237的AD数*/
static int32_t Read_CS1237_Ad_Data(void)
{
uint16_t bit_cout = 0;
int32_t data_temp = 0;
@@ -192,22 +206,22 @@ static int32_t Read_CS1238_Ad_Data(void)
data_temp = 0;
for (bit_cout = 0; bit_cout < 24; bit_cout++)
{
CS1238_SCLK_H();
CS1237_SCLK_H();
data_temp <<= 1; //左移1位准备接受数据 初始默认0
CS1238_100NS(3);//延时300ns
if(GET_CS1238_DOUT() == true) //有数值则累加
CS1237_5NS(60);//延时300ns
if(CS1237_DOUT_GET() == true) //有数值则累加
data_temp |= 1;
CS1238_SCLK_L();
CS1238_100NS(3);
CS1237_SCLK_L();
CS1237_5NS(60);
}
/* clk25 ~ clk27 */
for (bit_cout = 24; bit_cout < 27; bit_cout++)
{
CS1238_Clock(); //给一周期时钟
CS1237_Clock(); //给一周期时钟
}
CS1238_DOUT_H();
CS1238_SCLK_L();
CS1237_DOUT_H();
CS1237_SCLK_L();
if(data_temp > 0x7FFFFF) //取24位
{
@@ -216,190 +230,172 @@ static int32_t Read_CS1238_Ad_Data(void)
return data_temp;
}
void CS1238_IrqCallBack(void)
void RIGHTUP_CS1237_IrqCallBack(void)
{
CS1238IrqFlag = true;
CS1237IrqFlag = true;
}
void CS1238_Init(void)
void RIGHTUP_CS1237_Init(void)
{
CS1238IrqFlag = false;
CS1237IrqFlag = false;
BuildDelay = false;
CS1238IntEnable();
CS1238Var.Ain1_AD = 0;
CS1238Var.Ain2_AD = 0;
CS1238Var.Temp_AD = 0;
CS1238Var.Jump_AD = 0;
RIGHTUP_CS1237Var.AinA_AD = 0;
RIGHTUP_CS1237Var.Temp_AD = 0;
RIGHTUP_CS1237Var.Jump_AD = 0;
CS1238Port = CH_SEL_A;
CS1238Hz = SPEED_SEL_640Hz;
CS1238PGA = PGA_SEL_128;
CS1237IntEnable();
CS1237Port = CH_SEL_A;
CS1237Hz = SPEED_SEL_640Hz;
CS1237PGA = PGA_SEL_128;
uint8_t read_reg = 0x00;
uint8_t set_reg = REFO_ON | CS1238Hz | CS1238PGA | CS1238Port;
CS1238_1MS(20);
Set_CS1238_Config(set_reg);
CS1238_1MS(20);
read_reg = Read_CS1238_Config();
CS1238_1MS(20);
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("CS1238 Init ERR...\r\n");
DBG_LOG("set_reg = %02X\tread_reg = %02X\r\n",set_reg,read_reg);
InitFlag = false;
}
else {
DBG_LOG("CS1238 Init OK...\r\n");
DBG_LOG("RIGHTUP CS1237 Init ERR...\r\n");
//DBG_LOG("set_reg = %02X\tread_reg = %02X\r\n",set_reg,read_reg);
CS1238Port = read_reg & 0x03;
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 CS1238DataLoopCollect(void)
void RIGHTUP_CS1237DataLoopCollect(void)
{
static int32_t ad_array[PACK_NUM];
static uint8_t adcnt;
static uint8_t TimeOutmagcnt;
switch(CS1238Var.Status) {
case CS1238_STATUS_IDLE:{
switch(RIGHTUP_CS1237Var.Status) {
case RUCS1237_STATUS_IDLE:{
break;}
case CS1238_STATUS_START:{
case RUCS1237_STATUS_START:{
memset(&ad_array, 0x00, sizeof(ad_array));
adcnt = 0;
TimeOutmagcnt = 0;
memset(&CS1238Var, NULL, sizeof(CS1238Var));
memset(&RIGHTUP_CS1237Var, NULL, sizeof(RIGHTUP_CS1237Var));
if(BuildDelay == true)
{
BuildDelay = false;
if(CS1238Hz == SPEED_SEL_10Hz){
CS1238Var.CS1238Delay1mSCnt = tCon_10Hz;
if(CS1237Hz == SPEED_SEL_10Hz){
RIGHTUP_CS1237Var.CS1237Delay1mSCnt = tCon_10Hz;
}
if(CS1238Hz == SPEED_SEL_40Hz){
CS1238Var.CS1238Delay1mSCnt = tCon_40Hz;
if(CS1237Hz == SPEED_SEL_40Hz){
RIGHTUP_CS1237Var.CS1237Delay1mSCnt = tCon_40Hz;
}
if(CS1238Hz == SPEED_SEL_640Hz){
CS1238Var.CS1238Delay1mSCnt = tCon_640Hz;
if(CS1237Hz == SPEED_SEL_640Hz){
RIGHTUP_CS1237Var.CS1237Delay1mSCnt = tCon_640Hz;
}
if(CS1238Hz == SPEED_SEL6_1280Hz){
CS1238Var.CS1238Delay1mSCnt = tCon_1280Hz;
if(CS1237Hz == SPEED_SEL6_1280Hz){
RIGHTUP_CS1237Var.CS1237Delay1mSCnt = tCon_1280Hz;
}
CS1238Var.Status = CS1238_STATUS_DELAY;
RIGHTUP_CS1237Var.Status = RUCS1237_STATUS_DELAY;
}
else
{
CS1238Var.Status = CS1238_STATUS_READ;
RIGHTUP_CS1237Var.Status = RUCS1237_STATUS_READ;
}
break;}
case CS1238_STATUS_DELAY:{
if(CS1238Var.CS1238Delay1mSCnt <= 0){
CS1238Var.Status = CS1238_STATUS_READ;
case RUCS1237_STATUS_DELAY:{
if(RIGHTUP_CS1237Var.CS1237Delay1mSCnt <= 0){
RIGHTUP_CS1237Var.Status = RUCS1237_STATUS_READ;
}
break;}
case CS1238_STATUS_READ:{
CS1238IrqFlag = false;
CS1238Var.CS1238Delay1mSCnt = 100;
CS1238Var.Status = CS1238_STATUS_WAIT_READ;
case RUCS1237_STATUS_READ:{
CS1237IrqFlag = false;
RIGHTUP_CS1237Var.CS1237Delay1mSCnt = 100;
RIGHTUP_CS1237Var.Status = RUCS1237_STATUS_WAIT_READ;
break;}
case CS1238_STATUS_WAIT_READ:{
if(CS1238Var.CS1238Delay1mSCnt <= 0){
CS1238Var.Status = CS1238_STATUS_READ;
case RUCS1237_STATUS_WAIT_READ:{
if(RIGHTUP_CS1237Var.CS1237Delay1mSCnt <= 0){
RIGHTUP_CS1237Var.Status = RUCS1237_STATUS_READ;
TimeOutmagcnt++;
}
if(CS1238IrqFlag == true){
CS1238IrqFlag = false;
ad_array[adcnt++] = Read_CS1238_Ad_Data();
CS1238Var.Status = CS1238_STATUS_READ;
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(CS1238Port == CH_SEL_A){
CS1238Var.Ain1_AD = IntFilter_32t(ad_array, adcnt, 4);
CS1238Ain1DataProcessCallBack(CS1238Var.Ain1_AD);
if(CS1237Port == CH_SEL_A){
RIGHTUP_CS1237Var.AinA_AD = IntFilter_32t(ad_array, adcnt, FILTER_NUM);
RIGHTUP_CS1237AinADataProcessCallBack(RIGHTUP_CS1237Var.AinA_AD);
}
if(CS1238Port == CH_SEL_B){
CS1238Var.Ain2_AD = IntFilter_32t(ad_array, adcnt, 4);
CS1238Ain2DataProcessCallBack(CS1238Var.Ain2_AD);
if(CS1237Port == CH_SEL_TEMP){
RIGHTUP_CS1237Var.Temp_AD = IntFilter_32t(ad_array, adcnt, FILTER_NUM);
//CS1237TempDataProcessCallBack(LEFTLOW_CS1237Var.Temp_AD);
}
if(CS1238Port == CH_SEL_TEMP){
CS1238Var.Temp_AD = IntFilter_32t(ad_array, adcnt, 4);
CS1238TempDataProcessCallBack(CS1238Var.Temp_AD);
if(CS1237Port == CH_SEL_JUMP){
RIGHTUP_CS1237Var.Jump_AD = IntFilter_32t(ad_array, adcnt, FILTER_NUM);
//CS1237JumpDataProcessCallBack(LEFTLOW_CS1237Var.Jump_AD);
}
if(CS1238Port == CH_SEL_JUMP){
CS1238Var.Jump_AD = IntFilter_32t(ad_array, adcnt, 4);
CS1238JumpDataProcessCallBack(CS1238Var.Jump_AD);
}
CS1238Var.Status = CS1238_STATUS_CH_SEL;
RIGHTUP_CS1237Var.Status = RUCS1237_STATUS_CH_SEL;
}
else{
if(CS1238Port == CH_SEL_A){
DBG_LOG("CS1238 CHA TimeOut...\r\n");
if(CS1237Port == CH_SEL_A){
DBG_LOG("RIGHTUP CS1237 CHA TimeOut...\r\n");
}
if(CS1238Port == CH_SEL_B){
DBG_LOG("CS1238 CHB TimeOut...\r\n");
if(CS1237Port == CH_SEL_TEMP){
DBG_LOG("RIGHTUP CS1237 Temp TimeOut...\r\n");
}
if(CS1238Port == CH_SEL_TEMP){
DBG_LOG("CS1238 Temp TimeOut...\r\n");
if(CS1237Port == CH_SEL_JUMP){
DBG_LOG("RIGHTUP CS1237 Jump TimeOut...\r\n");
}
if(CS1238Port == CH_SEL_JUMP){
DBG_LOG("CS1238 Jump TimeOut...\r\n");
}
CS1238Var.Status = CS1238_STATUS_CH_SEL;
RIGHTUP_CS1237Var.Status = RUCS1237_STATUS_CH_SEL;
}
}
if(adcnt >= PACK_NUM){
if(CS1238Port == CH_SEL_A){
CS1238Var.Ain1_AD = IntFilter_32t(ad_array, adcnt, 4);
CS1238Ain1DataProcessCallBack(CS1238Var.Ain1_AD);
if(CS1237Port == CH_SEL_A){
RIGHTUP_CS1237Var.AinA_AD = IntFilter_32t(ad_array, adcnt, FILTER_NUM);
RIGHTUP_CS1237AinADataProcessCallBack(RIGHTUP_CS1237Var.AinA_AD);
}
if(CS1238Port == CH_SEL_B){
CS1238Var.Ain2_AD = IntFilter_32t(ad_array, adcnt, 4);
CS1238Ain2DataProcessCallBack(CS1238Var.Ain2_AD);
if(CS1237Port == CH_SEL_TEMP){
RIGHTUP_CS1237Var.Temp_AD = IntFilter_32t(ad_array, adcnt, FILTER_NUM);
//CS1237TempDataProcessCallBack(LEFTLOW_CS1237Var.Temp_AD);
}
if(CS1238Port == CH_SEL_TEMP){
CS1238Var.Temp_AD = IntFilter_32t(ad_array, adcnt, 4);
CS1238TempDataProcessCallBack(CS1238Var.Temp_AD);
if(CS1237Port == CH_SEL_JUMP){
RIGHTUP_CS1237Var.Jump_AD = IntFilter_32t(ad_array, adcnt, FILTER_NUM);
//CS1237JumpDataProcessCallBack(LEFTLOW_CS1237Var.Jump_AD);
}
if(CS1238Port == CH_SEL_JUMP){
CS1238Var.Jump_AD = IntFilter_32t(ad_array, adcnt, 4);
CS1238JumpDataProcessCallBack(CS1238Var.Jump_AD);
}
CS1238Var.Status = CS1238_STATUS_CH_SEL;
RIGHTUP_CS1237Var.Status = RUCS1237_STATUS_CH_SEL;
}
break;}
case CS1238_STATUS_CH_SEL:{
CS1238Var.Status = CS1238_STATUS_STOP;
case RUCS1237_STATUS_CH_SEL:{
RIGHTUP_CS1237Var.Status = RUCS1237_STATUS_STOP;
BuildDelay = false;
uint8_t read_reg;
if(CS1238Port == CH_SEL_A){
if(CS1237Port == CH_SEL_A){
#if(PORT_TEMP == 1)
read_reg = Read_CS1238_Config();
Set_CS1238_Config((read_reg & 0xFC) | CH_SEL_TEMP);
CS1238Port = CH_SEL_TEMP;
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_CS1238_Config();
Set_CS1238_Config((read_reg & 0xFC) | CH_SEL_JUMP);
CS1238Port = CH_SEL_JUMP;
read_reg = Read_CS1237_Config();
Set_CS1237_Config((read_reg & 0xFC) | CH_SEL_JUMP);
CS1237Port = CH_SEL_JUMP;
BuildDelay = true;
break;
#endif
}
if(CS1238Port == CH_SEL_B){
#if(PORT_TEMP == 1)
read_reg = Read_CS1238_Config();
Set_CS1238_Config((read_reg & 0xFC) | CH_SEL_TEMP);
CS1238Port = CH_SEL_TEMP;
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);
@@ -408,77 +404,60 @@ void CS1238DataLoopCollect(void)
break;
#endif
#if(PORT_A == 1)
read_reg = Read_CS1238_Config();
Set_CS1238_Config((read_reg & 0xFC) | CH_SEL_A);
CS1238Port = CH_SEL_A;
BuildDelay = true;
break;
#endif
}
if(CS1238Port == 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_CS1238_Config();
Set_CS1238_Config((read_reg & 0xFC) | CH_SEL_A);
CS1238Port = CH_SEL_A;
read_reg = Read_CS1237_Config();
Set_CS1237_Config((read_reg & 0xFC) | CH_SEL_A);
CS1237Port = CH_SEL_A;
BuildDelay = true;
break;
#endif
}
if(CS1238Port == CH_SEL_JUMP){
if(CS1237Port == CH_SEL_JUMP){
#if(PORT_A == 1)
read_reg = Read_CS1238_Config();
Set_CS1238_Config((read_reg & 0xFC) | CH_SEL_A);
CS1238Port = CH_SEL_A;
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_CS1238_Config();
Set_CS1238_Config((read_reg & 0xFC) | CH_SEL_TEMP);
CS1238Port = CH_SEL_TEMP;
read_reg = Read_CS1237_Config();
Set_CS1237_Config((read_reg & 0xFC) | CH_SEL_TEMP);
CS1237Port = CH_SEL_TEMP;
BuildDelay = true;
break;
#endif
}
break;}
case CS1238_STATUS_STOP:{
//CS1238Stop();
//CS1238Var.Status = CS1238_STATUS_IDLE;
CS1238Var.Status = CS1238_STATUS_START;//持续工作
case RUCS1237_STATUS_STOP:{
RIGHTUP_CS1237Stop();
RIGHTUP_CS1237Var.Status = RUCS1237_STATUS_IDLE;
//RIGHTUP_CS1237Var.Status = RUCS1237_STATUS_START;//持续工作
break;}
}
}
void CS12381mSRoutine(void)
void RIGHTUP_CS12371mSRoutine(void)
{
if(CS1238Var.CS1238Delay1mSCnt > 0)
CS1238Var.CS1238Delay1mSCnt--;
if(RIGHTUP_CS1237Var.CS1237Delay1mSCnt > 0)
RIGHTUP_CS1237Var.CS1237Delay1mSCnt--;
}
void CS1238Start(void)
void RIGHTUP_CS1237Start(void)
{
CS1238_WakeUp();
CS1238_1MS(2);
CS1237_WakeUp();
CS1237_1MS(2);
BuildDelay = true;
CS1238IntEnable();
CS1237IntEnable();
if(!InitFlag){
CS1238_Init();
RIGHTUP_CS1237_Init();
return;
}
CS1238Var.Status = CS1238_STATUS_START;
RIGHTUP_CS1237Var.Status = RUCS1237_STATUS_START;
}
void CS1238Stop(void)
void RIGHTUP_CS1237Stop(void)
{
CS1238IntDisable();
CS1238_Sleep();
CS1237IntDisable();
//CS1237_Sleep();
}
@@ -1,7 +1,7 @@
#include "bsp.h"
#ifndef _CS1238_H_
#define _CS1238_H_
#ifndef _CS1237_RIGHTUP_H_
#define _CS1237_RIGHTUP_H_
#define READ_CONFIG_CMD 0x56
#define WRITE_CONFIG_CMD 0x65
@@ -22,21 +22,11 @@
#define PGA_SEL_128 0x0C
#define CH_SEL_A 0x00
#define CH_SEL_B 0x01
//#define CH_SEL_B 0x01
#define CH_SEL_TEMP 0x02
#define CH_SEL_JUMP 0x03
#define CS1238_DOUT_OUT() SetBit(((uint32_t)&M0P_GPIO->PADIR + CS1238_DOUT_PORTx), CS1238_DOUT_PINx, 0)
#define CS1238_DOUT_IN() SetBit(((uint32_t)&M0P_GPIO->PADIR + CS1238_DOUT_PORTx), CS1238_DOUT_PINx, 1)
#define CS1238_DOUT_H() SET_CS1238_DOUT()
#define CS1238_DOUT_L() CLR_CS1238_DOUT()
#define CS1238_SCLK_H() SET_CS1238_SCLK()
#define CS1238_SCLK_L() CLR_CS1238_SCLK()
#define CS1238_1US(x) delay_us(x) //1us延时
#define CS1238_100NS(x) delay_ns(x) //100ns延时
#define CS1238_1MS(x) delay_ms(x) //1ms延时
/*Definition of conversion time corresponding to repeatability setting*/
/*
@@ -51,40 +41,39 @@
#define tCon_1280Hz 4 /* ms. */
#define PORT_A 1 //采集通道A
#define PORT_B 1 //采集通道B
#define PORT_TEMP 0 //采集温度
#define PORT_JUMP 0 //内短采集
#define PACK_NUM 10 //一次采集的数据包数量
//#define PORT_B 1 //采集通道B
#define PORT_TEMP 0 //采集温度
#define PORT_JUMP 0 //内短采集
#define PACK_NUM 1 //一次采集的数据包数量
#define FILTER_NUM 0 //滤波数
typedef enum{
CS1238_STATUS_IDLE,
CS1238_STATUS_START,
CS1238_STATUS_DELAY,
CS1238_STATUS_READ,
CS1238_STATUS_WAIT_READ,
CS1238_STATUS_CH_SEL,
CS1238_STATUS_STOP,
}CS1238Status_m;
RUCS1237_STATUS_IDLE,
RUCS1237_STATUS_START,
RUCS1237_STATUS_DELAY,
RUCS1237_STATUS_READ,
RUCS1237_STATUS_WAIT_READ,
RUCS1237_STATUS_CH_SEL,
RUCS1237_STATUS_STOP,
}RightUpCS1237Status_m;
typedef struct{
CS1238Status_m Status;
uint32_t CS1238Delay1mSCnt;
RightUpCS1237Status_m Status;
uint32_t CS1237Delay1mSCnt;
int32_t Ain1_AD;//AIN1ad数据
int32_t Ain2_AD;//AIN2ad数据
int32_t AinA_AD;//AINAad数据
//int32_t AinB_AD;//AINBad数据
int32_t Temp_AD;//温度ad数据
int32_t Jump_AD;//内短ad数据
}
CS1238Var_t;
extern CS1238Var_t CS1238Var;
RIGHTUP_CS1237Var_t;
void CS1238_Init(void);
void CS1238_IrqCallBack(void);
void CS1238DataLoopCollect(void);
void CS1238LoopHandler(void);
void CS12381mSRoutine(void);
void CS1238Start(void);
void CS1238Stop(void);
void RIGHTUP_CS1237_Init(void);
void RIGHTUP_CS1237_IrqCallBack(void);
void RIGHTUP_CS1237DataLoopCollect(void);
void RIGHTUP_CS12371mSRoutine(void);
void RIGHTUP_CS1237Start(void);
void RIGHTUP_CS1237Stop(void);
#endif