OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4758|回复: 7

求STM32-F103VC跟CS5530 SPI通讯程序问题?新人

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2017-8-7
在线时间
2 小时
发表于 2017-8-7 14:23:15 | 显示全部楼层 |阅读模式
1金钱
#include "sys.h"
#include "SPI.h"
#include "CS55301.h"
#include "delay.h"

void SPI_CS5530_Init(void)
{

        RCC->APB2ENR|=1<<2;       //PORTA时钟使能
        GPIOA->CRL&=0XFFF0FFFF;
        GPIOA->CRL|=0X00030000;   //PA4 推挽             
        GPIOA->ODR|=1<<4;         //PA4 上拉  输出高
        SPI1_Init();             //初始化SPI1
        SPI1_SetSpeed(SPI_SPEED_4);//设置为18M时钟,高速模式
}



/**********************************************************
*函数名:unsigned char CS5530_Read(void)
*功  能:CS5530读8位数据
*说  明:
**********************************************************/
u8 CS5530_Read(void)
{

        u8  Read_data;
        Read_data=SPI1_ReadWriteByte(0xff);  
        return Read_data;   
}

/**********************************************************
*函数名:unsigned long CS5530_Read_Dword (void)
*功  能:CS5530读32位数据
*说  明:
**********************************************************/
u32 CS5530_Read_Dword(void)
{
        u32 Read_data=0;

    SPI1_ReadWriteByte(0xff);  

                Read_data|=SPI1_ReadWriteByte(0xFF)<<24;


        return Read_data;
}


/**********************************************************
*函数名:void CS5530_Write(unsigned char Write_data)
*功  能:写8位数据
*说  明:unsigned char Write_data:需发送的数据
**********************************************************/
void CS5530_Write(u8 Write_data)
{
        SPI1_ReadWriteByte(Write_data);
}         



/**********************************************************
*函数名:void CS5530_Write_Dword(unsigned long Write_data)
*功  能:写32位数据
*说  明:unsigned char Write_data:需发送的数据
**********************************************************/
void CS5530_Write_Dword(u32 Write_data)
{
            
   SPI1_ReadWriteByte(Write_data>>24);  //发送32bit地址   
       
}


/**********************************************************
*函数名:void CS5530_Serial_Reset(void)
*功  能:
*说  明:
**********************************************************/
void CS5530_Serial_Reset(void) //1
{
        u8 i = 18;
        while(i-- )
        {
                 CS5530_Write(SYNC1) ;
        }         
                 CS5530_Write(SYNC0) ;
}


/**********************************************************
*函数名:void CS5530_Set(void)
*功  能:CS5530初始化
*说  明:
**********************************************************/
void CS5530_Set(void)
{
        u32 data;
        u32 CONFIG;
        u32 GAIN;
        u32 OFFSET;
        u8 read_data;
        u8 CS5530_rst;
  SPI_CS5530_Init();
        delay_ms(100);
        AD_CS= 0 ;
        CS5530_Serial_Reset();
        CS5530_Write(Write_CONFIG); //写配置寄存器
        CS5530_Write_Dword(SYSTEM_RESET) ; //初始化 0x20000000
        delay_us(1);
        CS5530_Write(Write_CONFIG); //写配置寄存器
        CS5530_Write_Dword(0x00000000) ; //初始化 0x20000000
        CS5530_Write(Read_CONFIG);
        read_data = CS5530_Read();
        CS5530_rst = read_data;
        read_data = CS5530_Read();
        read_data = CS5530_Read();
        read_data = CS5530_Read();
        while((CS5530_rst & 0x10) != 0x10)
        {
                CS5530_Write(Read_CONFIG);
                read_data = CS5530_Read();
                CS5530_rst = read_data;
                read_data = CS5530_Read();
                read_data = CS5530_Read();
                read_data = CS5530_Read();
        }
       
        CS5530_Write(Read_CONFIG);
        CONFIG = CS5530_Read_Dword();
        delay_us(1);
        CS5530_Write(Read_GAIN);
        GAIN = CS5530_Read_Dword();
        delay_us(1);
        CS5530_Write(Read_OFFSET);
        OFFSET = CS5530_Read_Dword();
        delay_us(1);
               
        CS5530_Serial_Reset();
        CS5530_Write(Write_CONFIG); //写配置寄存器
        CS5530_Write_Dword(0x00000000);
        delay_us(1);
        delay_us(1);
        CS5530_Write(Write_CONFIG); //写配置寄存器
        CS5530_Write_Dword(0x00084000);
        CS5530_Write(Write_GAIN);
        CS5530_Write_Dword(0x01000000);
//        CS5530_Write_Dword( NORMAL_MODE + VREF_HIGH + CR_A0_0 + CR_A1_0 + SHORT_INPUTS + LINE_FREQ_60 +DATARATE_200 + BIPOLAR_MODE + TURN_OFF_300NA ) ;
        CS5530_Write(START_CONTINUOUS);        //连续转换START_SINGLE
        delay_us(10);
//        CS5530_SDI = 0;
        CS5530_Write(0x00); //写入空指令,
        data = CS5530_Read_Dword();
}       

u32 CS5530_Result ( void )   
{     
   CS5530_Write ( NULL_BYTE ) ;   
   return   ( u32 )  ( CS5530_Read_Dword (  )  ) ;//   

}

u32 CS5530_ADC(void)
{
         u32 temp;
                CS5530_Write(START_SINGLE);
                CS5530_Write_Dword(NULL_BYTE);
                delay_us(1);
                temp=CS5530_Result ( ) ;
  return temp ;
}

/**********************************************************
*文件名:cs5530.h
*说  明:cs5530工程头文件
修改记录:
**********************************************************/
//cs5530.h
#include "sys.h"
#ifndef __cs5530_h__
#define __cs5530_h__

#define SYNC1 0xff
#define SYNC0 0xfe
#define NULL_BYTE 0x00
#define        AD_CS  PAout(4) //AD卡片选引脚               
// Command Register
//#define CMD_WRITE (0x00<<3)//写寄存器命令
//#define CMD_READ (0x01<<3)//读寄存器命令
#define CMD_WRITE 0x00        //写寄存器命令
#define CMD_READ (0x08)//读寄存器命令


#define REG_OFFSET 0x01 //偏移寄存器
#define REG_GAIN 0x02 //增益寄存器
#define REG_CONFIG 0x03 //配置寄存器

#define Write_GAIN 0x02   //写增益寄存器
#define Read_GAIN 0x0a    //读增益寄存器
#define Write_OFFSET 0x01 //写偏移寄存器命令
#define Read_OFFSET 0x09  //读偏移寄存器命令
#define Write_CONFIG 0x03 //写配置寄存器命令
#define Read_CONFIG 0x0b  //读配置寄存器命令

//#define START_SINGLE (0x00<<6) //单次转换
//#define START_CONTINUOUS (0x01<<6)//连续转换
#define START_SINGLE 0x80 //单次转换,转换命令
#define START_CONTINUOUS 0xc0//连续转换

//#define NORMAL_CONVERSION (0x80+0x00)//转换命令
#define SYSTEM_OFFSET_CAL (0x80+0x05)//执行偏移校准
#define SYSTEM_GAIN_CAL (0x80+0x06)// 执行增益校准
// Configuration Register
//#define STANDBY_MODE (0x00L<<31)//待机模式
//#define SLEEP_MODE (0x01L<<31)//休眠模式
//#define POWER_SAVE_MODE (0x01L<<30) //节电模式
#define STANDBY_MODE 0x00000000 //待机模式
#define SLEEP_MODE (0x01L<<31)//休眠模式
#define POWER_SAVE_MODE (0x01L<<30) //节电模式

#define NORMAL_MODE (0x00L<<29) //正常操作
#define SYSTEM_RESET (0x01L<<29)//激活一个复位周期 复位后自动清0

#define RESET_STATUS (0x01L<<28) //复位有效 系统已复位 只读

#define SHORT_INPUTS (0x00L<<27) //输入正常输入 个通道输入不断接


#define VREF_HIGH (0x00L<<25) //参考电压 2.5~((VA+)-(VA-))V
#define VREF_LOW (0x01L<<25)//参考电压 1~2.5V

#define CR_A1_0 (0x00L<<24)
#define CR_A1_1 (0x01L<<24)

#define CR_A0_0 (0x00L<<23)
#define CR_A0_1 (0x01L<<23)

#define LINE_FREQ_60 (0x00L<<19) //滤波数率选择 缺省输入字
#define LINE_FREQ_50 (0x01L<<19) //输出字数率及相应滤波器特性乘以系数5/6

#define DATARATE_100 (0x00L<<11) //字数率 不同位就不同
#define DATARATE_50 (0x01L<<11)
#define DATARATE_25 (0x02L<<11)
#define DATARATE_12P5 (0x03L<<11)
#define DATARATE_6P25 (0x04L<<11)
#define DATARATE_3200 (0x08L<<11)
#define DATARATE_1600 (0x09L<<11)
#define DATARATE_800 (0x0aL<<11)
#define DATARATE_400 (0x0bL<<11)
#define DATARATE_200 (0x0cL<<11)

#define BIPOLAR_MODE (0x00L<<10) //极性选择双极性模式
#define UNIPOLAR_MODE (0x01L<<10)//极性选择单极性模式

#define TURN_OFF_300NA (0x00L<<9) //不激活电流源
#define TURN_ON_300NA (0x01L<<9) //激活电流源300ma

/******************子函数******************/
void SPI_CS5530_Init(void);
u8 CS5530_Read(void);
u32 CS5530_Read_Dword(void);
//u32 CS5530_Read_Dword(u32 Read_data);
void CS5530_Write(u8 Write_data);
//u8 AD_SPI_ReadWriteByte(u8 data);
void CS5530_Write_Dword(u32 Write_data);
void CS5530_Set(void);
void CS5530_Serial_Reset(void);
void CS5530_System_Reset(void);
u32 CS5530_ADC(void);
u32 CS5530_Result ( void );
u32 CS5530_ReadReg(u8 reg);

#endif


CS5530中文资料.zip

645.61 KB, 下载次数: 189

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2017-8-8 01:51:14 | 显示全部楼层
回复

使用道具 举报

0

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2017-12-22
在线时间
18 小时
发表于 2018-1-21 22:14:45 | 显示全部楼层
帮顶!!!!!!!!!!!!!!
回复

使用道具 举报

0

主题

7

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2019-5-23
在线时间
3 小时
发表于 2019-9-17 16:11:20 | 显示全部楼层
原子哥,请问有这个的SPI.c件吗
回复

使用道具 举报

0

主题

7

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2019-5-23
在线时间
3 小时
发表于 2019-9-17 16:31:03 | 显示全部楼层
Definitely 发表于 2019-9-17 16:11
原子哥,请问有这个的SPI.c件吗

哈哈,找到了例程里的修改了一下
回复

使用道具 举报

0

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
186
金钱
186
注册时间
2019-5-5
在线时间
74 小时
发表于 2019-9-19 16:38:13 | 显示全部楼层
ad的读写都不对。。搞了好久原来错在这里
回复

使用道具 举报

0

主题

7

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2019-5-23
在线时间
3 小时
发表于 2019-10-24 16:47:44 | 显示全部楼层
可能否 发表于 2019-9-19 16:38
ad的读写都不对。。搞了好久原来错在这里

你好,你说的AD读写是读写函数吗,我也在看这个部分很久了
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2019-11-28
在线时间
0 小时
发表于 2019-11-28 15:27:15 | 显示全部楼层
请问哪里出问题了,我也一直搞不定,郁闷啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-24 23:53

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表