驱动程序——MCP3208——基于STM32F103
最近使用了MCP3208这款芯片,附上驱动代码:
u16 mcp_getAD(u8 channel)
{
u8 i=0;
//u16 temp= ((u16)channel|0x0018)<<4;
u16 temp= 0x0F80;
//0000 11 11 1 000 0000
u16 resualt=0;
//u8 temp1=0x06|(channel>>2);
//u8 temp2=channel<<6;
//temp=
GPIO_ResetBits(mcp_Port,mcp_CS);//CS=0
//
GPIO_ResetBits(mcp_Port,mcp_CLK);//CLK=0
delay_us(20);
for(i=0;i<10;i++)
{
GPIO_SetBits(mcp_Port,mcp_CLK);//CLK=1
delay_us(20);
GPIO_ResetBits(mcp_Port,mcp_CLK);//CLK=0
if(temp&0x8000)
GPIO_SetBits(mcp_Port,mcp_DOUT);//DOUT=1
else
GPIO_ResetBits(mcp_Port,mcp_DOUT);//DOUT=0
delay_us(20);
temp<<=1;
}
GPIO_SetBits(mcp_Port,mcp_CLK);//CLK=1
delay_us(20);
GPIO_ResetBits(mcp_Port,mcp_CLK);//CLK=0
delay_us(20);
GPIO_SetBits(mcp_Port,mcp_CLK);//CLK=1
delay_us(20);
GPIO_ResetBits(mcp_Port,mcp_CLK);//CLK=0
delay_us(20);
for(i=0;i<12;i++)
{
resualt<<=1;
GPIO_SetBits(mcp_Port,mcp_CLK);//CLK=1
if(GPIO_ReadInputDataBit(mcp_Port,mcp_DIN))
resualt|=0x0001;
delay_us(20);
GPIO_ResetBits(mcp_Port,mcp_CLK);//CLK=0
delay_us(20);
}
GPIO_SetBits(mcp_Port,mcp_CS);//CS=0
return resualt;
}
以上是采用模拟SPI做的,我个人更喜欢直接用IO模拟SPI,不太喜欢用芯片自带的SPI,因为用IO模拟,可以更方便的使用引脚而不受限制,
当然,模拟SPI可能在速度上没有自带SPI高,就看使用场合吧,各有优缺点。
如果我的淘宝店铺有您需要的宝贝,请移驾我的店铺,后续还会有更多的好玩的,好用的宝贝,敬请期待!
淘宝店铺:
https://shop237937135.taobao.com/shop/view_shop.htm?shop_id=237937135