4^B:Q9B)
使用模拟SPI的方式 r,dxW5v.
LvS3c9|Aj
#define DP_SI PBout(14) // PB14 - SI Jh:-<xy)
#define DP_SCK PBout(15) // PB15 - SCK !PrO~
#define DP_CS PCout(8) // PC8 - CS %25_
& ~[%N
O
/*此处定义DP_SCK模拟时序的延时,可更改其延时时间来更改电平保持时间,从而影响通信速率 */ P.1iuZ "w
//如果外部信号线过长,需要降低通信速率,可将该值改大 HM1y$ej
#define MCP_SCK_delay delay_us(1) O^gq\X4}
_E[{7"3}
$RSVN?
//MCP41010芯片初始化,控制放大倍数:PB14-SI, PB15-SCK, PC8-CS UoxF00H@!
void MCP41010_Init(void) W.,J'
{ XsHl%o8,z
GPIO_InitTypeDef GPIO_InitStructure; 7+u%]D!
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOC, ENABLE);//使能GPIOB,GPIOC时钟 QX~*aqS3s8
9tC8|~Q
//GPIOB初始化设置 \9k{"4jX\
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14 | GPIO_Pin_15; //SI, SCK对应IO口 M !OI :v
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //普通输出模式 \>/:@4oK
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出 |@-WC.
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //100MHz 0+:.9*g=k
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉 LDvF)Eg
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化GPIO qkUr5^1
e@,,;YO#4
//GPIOC初始化设置 |_2ANWHz
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //CS对应IO口 .Um%6a-
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //普通输出模式 0_D~n0rq,v
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出 #CQ>d8&
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //100MHz '\*Rw]bR|
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉 qryt1~Dq
GPIO_Init(GPIOC, &GPIO_InitStructure); //初始化GPIO }\DQxHG
v,i:vT\~
GPIO_ResetBits(GPIOB,GPIO_Pin_14 | GPIO_Pin_15); //GPIOB14,15置低 '7*=m^pc
GPIO_ResetBits(GPIOC,GPIO_Pin_8); //GPIOC8置低 YJ16vb9
} '/
&"
fF[ g%?w
f|^f^Hu:{
//SPI发送单字节 A^p $~e\)
//xtemp:发送的字节
B?%D
void MCP41010_SPI_SendOneByte(uint8_t xtemp) eu:_V+
{ (
L6`_)
uint8_t xnum = 0; ? s ewU9*
gwYd4
/* DP_SCK发送8个脉冲,在上升沿时送入数据 */ +Ae.>%}
for(xnum=0; xnum<8; xnum++) |B`tRq
{ j5)qF1W,
//DP_SI写数据 v1lj /A
DP_SI = (xtemp & 0x80) >>7; z*[Z:
xtemp = xtemp << 1; 5UM[Iz
<C{5(=X{
//延时待数据稳定后,在DP_SCK产生上升沿脉冲,数据送入MCP41010 y d$37G|n
MCP_SCK_delay; j&mL]'Zy
DP_SCK = 1; =%
JDo
Bm7GU`j"
//DP_SCK产生下降沿脉冲 Ji[w; [qL
MCP_SCK_delay; W[m_IY
DP_SCK = 0; WE7l[<b
} >lW*%{|b$^
} T:&+#0<
rN~`4mZ
//设置MCP41010的滑动变阻器抽头位置 awK'XFk
//xRes:电阻编码值 nJya1AH;
//注:00时,W抽头处于抽头B的位置,阻值等于抽头电阻,典型值为52Ω ]x G4T>S
//注:FF时,W抽头处于抽头A的位置,阻值等为9985.94Ω,抽头始终不会与A端相连 yW&iUh=0
//注:对于10KΩ的器件来说,LSB为39.0625Ω uSQ*/h-<)0
//注:每次芯片上电后,抽头寄存器的值为0x80 ({9!P30:
void MCP41010_SetRes(uint8_t xRes) Y"jDZG?
{ ;~bn@T-
//MCP41010芯片使能 `+o.w#cl
DP_CS = 0; ;hvXFU
31C]TdJ
//发送第一字节,控制方式位 ZkJM?Fzq
//0x13。写数据,对电位器0,1操作 :qp"Ao{M
MCP41010_SPI_SendOneByte(0x13); `IoX'|C[h
lBdF9F<
//发送第二字节,滑动变阻器抽头位 h,+=h;!
MCP41010_SPI_SendOneByte(xRes); _2Z3?/Y
K?je(t^
//MCP41010芯片失能 ]`XuE-Uh
DP_CS = 1; gsp7N
}