STC8H_硬件SPI控制CBM128S085TS数模转换芯片DAC

STC8H_硬件SPI控制CBM128S085TS数模转换芯片DAC

测试平台:STC8H1K17-36I-TSSOP20
晶振频率为:在这里插入图片描述

MUC硬件部分所用的引脚

在这里插入图片描述

MCU的SPI相关寄存器手册

STC8只有三个寄存器 分别为状态寄存器,控制寄存器,数据寄存器。
在这里插入图片描述
在这里插入图片描述

SPI驱动代码部分

设置成主机模式。

#ifndef __HARDSPI_H
#define __HARDSPI_H
#include <STC8HX.h>
#include "delay.h"
#include <stdio.h>

#define   HARDSPI_SPIF    0x80        //SPI传输完成标志。写入1清0。
#define   HARDSPI_WCOL    0x40        //SPI写冲突标志。写入1清0。

#ifndef   HARDSPI_SPI_SCK_PIN
#define   HARDSPI_SPI_SCK_PIN       P1_5
#endif

#ifndef   HARDSPI_SCK_PIN_MODE
#define   HARDSPI_SCK_PIN_MODE    {P1M1&=~0x20;P1M0&=~0x20;}    //P15双向IO口
#endif

#ifndef   HARDSPI_SPI_MISO_PIN
#define   HARDSPI_SPI_MISO_PIN      P1_4
#endif

#ifndef   HARDSPI_MISO_PIN_MODE
#define   HARDSPI_MISO_PIN_MODE   {P1M1&=~0x10;P1M0&=~0x10;}    //P14双向IO口
#endif

#ifndef   HARDSPI_SPI_MOSI_PIN
#define   HARDSPI_SPI_MOSI_PIN      P1_3
#endif 

#ifndef   HARDSPI_MOSI_PIN_MODE
#define   HARDSPI_MOSI_PIN_MODE   {P1M1&=~0x08;P1M0&=~0x08;}    //P13双向IO口
#endif

#define   HARDSPI_CPHA              1      //数据 SS 管脚为低电平驱动第一位数据并在 SCLK 的后时钟沿改变数据
#define   HARDSPI_CPOL              0      //SCLK 空闲时为低电平,SCLK 的前时钟沿为上升沿,后时钟沿为下降沿

void hardspi_init(uint8 speed);         //spi初始化
void hardspi_write_byte(uint8 out);     //spi写一个字节
uint8 hardspi_read_byte();              //spi读取一个字节
uint8 hardspi_wr_data(uint8 dat);      //spi写入一个字节并且返回一个读取的字节

//========================================================================
// 描述: SPI初始化.
// 参数: speed:通信速率(0~3).
// 返回: none.
//========================================================================
void hardspi_init(uint8 speed)
{
   
    HARDSPI_SCK_PIN_MODE;            //引脚初始化
    HARDSPI_MISO_PIN_MODE;
    HARDSPI_MOSI_PIN_MODE;

    SPCTL |=  (1 << 7);         //忽略 SS 引脚功能,使用 MSTR 确定器件是主机还是从机
    SPCTL |=  (1 << 6);         //使能 SPI 功能
    SPCTL &= ~(1 << 5);         //先发送/接收数据的高位( MSB)
    SPCTL |=  (1 << 4);         //设置主机模式
    SPCTL &= ~(1 << 3);         //设置CPOL  
    SPCTL |=  (HARDSPI_CPOL << 3);

    SPCTL &= ~(1 << 2);         //设置CPHA
    SPCTL |=  (HARDSPI_CPHA << 2);

    SPCTL = (SPCTL & ~3) | speed;           //SPI 时钟频率选择, 0: 4T, 1: 8T,  2: 16T,  3: 32T
    P_SW1 = (P_SW1 & ~(3<<2));// | (1<<2); //IO口切换. 0: P1.2/P5.4 P1.3 P1.4 P1.5,      1: P2.2 P2.3 P2.4 P2.5,     2: P5.4 P4.0 P4.1 P4.3,     3: P3.5 P3.4 P3.3 P3.2

    HARDSPI_SPI_SCK_PIN = 0;        //将时钟设置为低初始状态
    HARDSPI_SPI_MOSI_PIN = 1;
    SPSTAT = HARDSPI_SPIF + HARDSPI_WCOL;   //清0 SPIF和WCOL标志
}

//========================================================================
// 描述: SPI写一个字节.
// 参数: none.
// 返回: none.
//========================================================================
void hardspi_write_byte(uint8 out)
{
    SPDAT = out;
    while((SPSTAT & HARDSPI_SPIF) == 0) ;
    SPSTAT = HARDSPI_SPIF + HARDSPI_WCOL;   //清0 SPIF和WCOL标志
}

//========================================================================
// 描述: SPI读一个字节.
// 参数: none.
// 返回: none.
//========================================================================
uint8 hardspi_read_byte()
{
    SPDAT = 0xff;
    while((SPSTAT & HARDSPI_SPIF) == 0) ;
    SPSTAT = HARDSPI_SPIF + HARDSPI_WCOL;   //清0 SPIF和WCOL标志
    return (SPDAT);
}

//========================================================================
// 描述: SPI写入一个字节后读取一个字节数据.
// 参数: none.
// 返回: none.
//========================================================================
uint8 hardspi_wr_data(uint8 dat)
{
    SPDAT = dat;
    while((SPSTAT & HARDSPI_SPIF) == 0) ;
    SPSTAT = HARDSPI_SPIF + HARDSPI_WCOL;   //清0 SPIF和WCOL标志
    return (SPDAT);
}

CBM128S085TS原理图部分

在这里插入图片描述

CBM128S085TS寄存器以及说明部分

简介:CBM128S085TS具有8通道的DAC输出。 分辨率 (ResN )为12位 带输出缓冲驱动的电压输出数模转换器,DAC架构为电阻串(string)DAC

串行输入寄存器说明
在这里插入图片描述
在这里插入图片描述

CBM128S085TS驱动部分

//========================================================================
// 描述: CBM128S085芯片八通道调压 0~5V模块.
// 参数: channel: 0~7通道  Voltage: 调整电压
// 返回: none.
//========================================================================
void CBM128S085_write_Valtage(uint8 channel, unsigned int Valtage)
{
	unsigned int data_H =0,data_L =0;
//	printf("%X\r\n",Valtage);
	data_H = ((channel << 4) | (Valtage >> 8));
//	printf("data_H:%X\r\n",data_H);
	data_L = Valtage & 0xFF;
//	printf("data_L:%X\r\n",data_L);	
	
  P1_2 = 0;
	hardspi_write_byte(data_H);
	hardspi_write_byte(data_L);	
  P1_2 = 1;
//	printf("%X\r\n",data_H);
//	printf("%X\r\n",data_L);	
	
	nop_delay();
	nop_delay();
	
	P1_2 = 0;
	hardspi_write_byte(0xA0);
	hardspi_write_byte(1<<channel);	
  P1_2 = 1;
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

谢谢~谢先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值