二者通讯说有两种,一种是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,但是就一次都写不进去了!
求大神指教!!!!!跪求!!!!!
|