oOuhbFu
使用模拟SPI的方式 .ukP)rGe
,z)7rU`
#define DP_SI PBout(14) // PB14 - SI _tQ=ASe0
#define DP_SCK PBout(15) // PB15 - SCK b9(d@2MtK
#define DP_CS PCout(8) // PC8 - CS J-fU,*Bk
/D_8uTS>d[
/*此处定义DP_SCK模拟时序的延时,可更改其延时时间来更改电平保持时间,从而影响通信速率 */ 0.nS306
//如果外部信号线过长,需要降低通信速率,可将该值改大 &_&])V)<\S
#define MCP_SCK_delay delay_us(1) y^zVb\"4
P_t8=d
fPHv|_XM>
//MCP41010芯片初始化,控制放大倍数:PB14-SI, PB15-SCK, PC8-CS O'm&S?>
void MCP41010_Init(void) F5%-6@=
{
'TV^0D"
GPIO_InitTypeDef GPIO_InitStructure; `4Z#/g
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOC, ENABLE);//使能GPIOB,GPIOC时钟 -(>x@];r0
r{kV*^\E
//GPIOB初始化设置 5JI+42S
\
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14 | GPIO_Pin_15; //SI, SCK对应IO口 C4Q^WU+$j
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //普通输出模式 N7Z&_$Bx
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出 LaJc;Jt$
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //100MHz L]#J?lE&
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉 *ZGQ`#1.X6
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化GPIO [kFX>G4
"twV3R
//GPIOC初始化设置 @P"q`*
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //CS对应IO口 0(3t#
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //普通输出模式 *E.{i
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出 P _Zf(`jJ
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //100MHz '[5tc fG#z
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉 iTbmD
GPIO_Init(GPIOC, &GPIO_InitStructure); //初始化GPIO RgQ\Cs24Q
6%ID*
GPIO_ResetBits(GPIOB,GPIO_Pin_14 | GPIO_Pin_15); //GPIOB14,15置低 pZGso
GPIO_ResetBits(GPIOC,GPIO_Pin_8); //GPIOC8置低 h=4m2m
} 3Du&KZ
nI.#A
nH% /
//SPI发送单字节 Ff& VBm
//xtemp:发送的字节 Bi
kCjP[b
void MCP41010_SPI_SendOneByte(uint8_t xtemp) zv#i\8h^p
{ >g93Bj*
uint8_t xnum = 0; H:9(
XW
$F G4wA
/* DP_SCK发送8个脉冲,在上升沿时送入数据 */ Z#>k:v
for(xnum=0; xnum<8; xnum++) HK&F'\'}
{ yYdXAenQ
//DP_SI写数据 FPFt3XL
DP_SI = (xtemp & 0x80) >>7; LAf!y"A#
xtemp = xtemp << 1; |}q0G~l
)_.@M '?
//延时待数据稳定后,在DP_SCK产生上升沿脉冲,数据送入MCP41010 ZQl[h7c/N
MCP_SCK_delay; 0<v~J9i
DP_SCK = 1; c!Pi)
`?=AgGg
//DP_SCK产生下降沿脉冲 g"C$B Fc
MCP_SCK_delay; 4)'5;|pI
DP_SCK = 0; uaJ5'*
} ,fET.s^|U
} "t"dz'
}(M<sEK~
//设置MCP41010的滑动变阻器抽头位置 92
Pp.Rh
//xRes:电阻编码值 'Q(A5zfN]Y
//注:00时,W抽头处于抽头B的位置,阻值等于抽头电阻,典型值为52Ω mvUYp,JECl
//注:FF时,W抽头处于抽头A的位置,阻值等为9985.94Ω,抽头始终不会与A端相连 &g)
`
//注:对于10KΩ的器件来说,LSB为39.0625Ω L<8y5B~W
//注:每次芯片上电后,抽头寄存器的值为0x80 m>NRIEA6
void MCP41010_SetRes(uint8_t xRes) ~01rc
{ ,~G _3Oz
//MCP41010芯片使能 fRrHWE+
DP_CS = 0; 3\mFK$#sr
msY"Y*4
//发送第一字节,控制方式位 ?m?e2{]u,
//0x13。写数据,对电位器0,1操作 z+-k4
MCP41010_SPI_SendOneByte(0x13); g4Hq<W"
8`u#tl(
//发送第二字节,滑动变阻器抽头位 e@8I%%V,
MCP41010_SPI_SendOneByte(xRes); X:62)^~'
qKO\;e*
//MCP41010芯片失能 #v(+3Hp
DP_CS = 1; 9sE>K)
}