|

楼主 |
发表于 2020-11-11 16:31:06
|
显示全部楼层
参照书本DS1302时钟芯片SDI通信的例子和论坛老师的STC15W408AS的例子MCP4822比葫芦画瓢编程还没测试运行有几个警告。
#include<reg52.h> //包含52系列单片机头文件
#include<intrins.h> //包含52系列单片机函数头文件
#define uchar unsigned char //为宏定义,把unsigned char用uchar表示,方便书写
#define uint unsigned int //为宏定义,把unsigned int用uint表示,方便书写
sbit MCP4822_SCL = P2^5; //SCLK
sbit MCP4822_LDAC = P2^4; //LDAC
sbit MCP4822_SDI = P2^3; //SDI
sbit MCP4822_CS = P2^2; //cs
void setVoltage(uchar config, uint dat)
{
uint command = 0;
uchar i;
command |= config << 12; //config 0x01 --A通道 x2最高输出4096mV 关闭输出 0x00
//config 0x03 --A通道 x1最高输出2048mV 关闭输出 0x02
//config 0x09 --B通道 x2最高输出4096mV 关闭输出 0x08
command |= (dat & 0x0FFF); //config 0x0b --B通道 x1最高输出2048mV 关闭输出 0x0b 设置和数据到command
MCP4822_CS =1; //刚开始MCP4822_CS为高电平
MCP4822_LDAC =1 ; //MCP4822_LDAC为高电平
MCP4822_SCL =0; //刚开始MCP4822_SCL为低平
MCP4822_CS = 0;; //ce变为低电平,允许单片机向MCP4822中的寄存器写入设置参数和数据
_nop_(); //稍微延时(一个机器周期)
for (i=0; i<16;i++)
{
MCP4822_SCL=0 ;
//MCP4822_SDI=command&0x80>>15 ;
command=command<<1 ;
MCP4822_SDI=CY; // command<<1高位溢出最高位自动寄存在CY
MCP4822_SCL=1 ; //config 0x09 --B通道 x2最高输出4096mV 关闭输出 0x08
}
MCP4822_CS = 1; //设置参数和数据写完之后,把MCP4822_CS拉高,防止对写入的数据进行误操作
_nop_(); //稍微延时
MCP4822_SDI=1; //释放MCP4822_SDI数据线
MCP4822_SCL=1; //释放sclk时钟线
MCP4822_LDAC=0; //输入存储器数据传递到DAC存储器。
MCP4822_LDAC=1;
}
处理后还有两个
Build target 'Target 1'
compiling MCP4822.c...
linking...
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
SEGMENT: ?PR?_SETVOLTAGE?MCP4822
*** WARNING L10: CANNOT DETERMINE ROOT SEGMENT
Program Size: data=8.0 xdata=0 code=56
"MCP4822" - 0 Error(s), 2 Warning(s).
在线翻译:***警告L16:未分类的段,忽略了覆盖过程
区隔:?PR?_SETVOLTAGE?MCP4822
***警告L10:无法确定根段
MCP4822写是由高位依次到低位我用左移后MCP4822_SDI=command&0x80>>15 ;还有command<<1左移后高位进入 MCP4822_SDI=CY有点拿不准。
补充内容 (2020-11-12 10:26):
少主函数, |
|