打印
[STM32F4]

stm32f407和MCP41050通讯控制电阻

[复制链接]
1188|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
罹颜维絮|  楼主 | 2015-7-1 17:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
二者通讯说有两种,一种是SPI,另一种是模拟SPI
mcp41050只有SCK,CI,SI相连,所以选择通过 模拟SPI设置三个接口的高低电平实现。如下:
void delay_nus(u32 n)
{
        u8 j;
        while(n--)
        {
                j=8;
                while(j--);
        }
}


void SPI1_Init(void)
{         
  GPIO_InitTypeDef  GPIO_InitStructure;
  //SPI_InitTypeDef  SPI_InitStructure;
       
   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//ʹÄÜGPIOAʱÖÓ
  //RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);//ʹÄÜSPI1ʱÖÓ

  //GPIOFB3,4,5³õʼ»¯ÉèÖÃ
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7|GPIO_Pin_8 |GPIO_Pin_6;//13ÊÇsck£¬14ÊÇmiso£¬12Ƭѡ
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//ÍÆÍìÊä³ö
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;//100MHz
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//ÉÏÀ­
  GPIO_Init(GPIOB, &GPIO_InitStructure);//³õʼ»¯
       
        //GPIO_PinAFConfig(GPIOB,GPIO_PinSource13,GPIO_AF_SPI2); //PB3¸´ÓÃΪ SPI1
        //GPIO_PinAFConfig(GPIOB,GPIO_PinSource14,GPIO_AF_SPI2); //PB4¸´ÓÃΪ SPI1
        //GPIO_PinAFConfig(GPIOB,GPIO_PinSource15,GPIO_AF_SPI2); //PB5¸´ÓÃΪ SPI1
       
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//¸´Óù¦ÄÜ
  //GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//ÍÆÍìÊä³ö
  //GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;//100MHz
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;//ÉÏÀ­
  GPIO_Init(GPIOB, &GPIO_InitStructure);//³õʼ»¯
}


void write_MCP_16(unsigned char cd, unsigned char dat_a)
{
char j;

u16 x;
        GPIO_SetBits(GPIOB, GPIO_Pin_6);        //ƬѡÀ­¸ß
        GPIO_SetBits(GPIOB, GPIO_Pin_7);        //ʱÖÓÀ­¸ß
        GPIO_ResetBits(GPIOB, GPIO_Pin_8);        //Êý¾ÝÀ­µÍ
        x=(u16)cd*256+(u16)dat_a; //8¡·16

        GPIO_ResetBits(GPIOB, GPIO_Pin_6);
        delay_nus(0x50);
        GPIO_ResetBits(GPIOB, GPIO_Pin_7);
                for(j=0;j<16;j++)
                {
                 GPIO_ResetBits(GPIOB, GPIO_Pin_7);
                        delay_nus(0x20);
                        if((x&0x8000)==0x8000)
                          GPIO_SetBits(GPIOB, GPIO_Pin_8);
                        else
                          GPIO_ResetBits(GPIOB, GPIO_Pin_8);
                        x=x<<1;
                        GPIO_SetBits(GPIOB, GPIO_Pin_7);
                        delay_nus(0x20);
                }
         GPIO_SetBits(GPIOB, GPIO_Pin_6);
}
然后主函数直接调用,放到while(1)循环中会一直写,数据一直变,我想只写一次,所以去掉while,但是就一次都写不进去了!
求大神指教!!!!!跪求!!!!!
       
       
       

沙发
amanda_s| | 2015-7-2 17:17 | 只看该作者
放在while里面的时候,发的数据是对的吗?

使用特权

评论回复
板凳
罹颜维絮|  楼主 | 2015-7-2 19:43 | 只看该作者
amanda_s 发表于 2015-7-2 17:17
放在while里面的时候,发的数据是对的吗?

是啊,开始是对的,然后过一会会突然跳变成其他的数,跳几下又稳定成正确值,过会又跳变。我只想让它写一次,写进去就不再变化。但是换成for循环,加上中断什么的都写不进去,只有while(1)能写进去。除非把stm关掉,数值就稳定了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

4

帖子

0

粉丝