使用IAP15 SPI写数字电位器MCP41XXX

使用IAP15单片机的SPI控制数字电位器MCP41XXX


前一篇的仪表中采用了一个MCP41100的数字电位器,这个数字电位器采用了SPI通讯,为设置电位器提供了快捷的方式,过去也采用过数字端控制的电位器,有电阻增加和电阻减小的数字端子,当要增加电阻时,需要使电阻的INC端接高电平,等待电阻升高, MCP4011数字电位计介绍。而采用SPI的数字电位器可以直接输入响应的电阻值,电阻的变化在150ns后就会生效。

1. SPI的硬件连接

SPI和单片机连接可以是硬件的SPI也可以是普通的SPI,我采用了普通端子连接SPI,有三个端子:

CS P1.2 - 片选信号
SCLK P1.5 - 时钟
SI P1.3 - 数据输入,对于单片机是MOSI

注意,在IAP15中,这三个点是硬件SPI的点,但我在软件中没有采用这些点。而是使用了软SPI的方式通讯。

2. 软件

为试验通讯,采用串口输入数据,然后通过SPI发送到MCP,试验效果。

2.1 初始化

sbit bCS  = P1^2;
sbit bSCK = P1^5;
sbit bMOSI = P1^3;

将所有的数字口设置成准双向口,初始化就完成了。

2.2 串口接收命令并发送

在主程序中添加检测串口输入语句,当输入是spi时读取输入的数字,如果数字小于255的化,发送到SPI。

    if ( strncmp(RX1_Buffer, "spi", 3) == 0)
    {
    
    
     sscanf(mStr1, "%s %d\r\n", mStr2, &u16Temp);
     if ( u16Temp < 255 )
     {
    
    
      SPIData = u16Temp;
      printf("The SPIData will be send: %d\r\n", (u16)SPIData);
      bCS = 0;
      writeByte(0x11);
      writeByte(SPIData);
      bCS = 1;      
     }
    }

下面是写SPI的分程序,writeByte(u8 Data)

void writeByte(u8 xSend)
{
    
    
 u8 i;
 
 bMOSI = 0;
 bSCK = 0;
 
 for ( i = 0; i < 8; i++ )
 {
    
    
  bMOSI = 0;
  bSCK = 0;
  if ( xSend & 0x80 )
  {
    
    
   bMOSI = 1;
  }
  bSCK = 0;
  bSCK = 1;
  xSend <<= 1;
 }
}

以上程序在IAP15单片机上通过。

3. 总结

SPI并不一定要使用硬件的接口,可以通过软件实现,这在和SX1278等的通讯中验证是完全可以胜任的,这次的试验也验证了软SPI可以和具有SPI接口的部件通讯。

猜你喜欢

转载自blog.csdn.net/weixin_44481398/article/details/104069344
今日推荐