本帖最后由 wang12zhe 于 2014-8-9 11:02 编辑
我使用STM32F4O7VET6的IO驱动74HC595D来控制LED,但是始终不成功,请大侠帮忙看看哪里问题
我的电路图路上
源码如下:
void LED_init(void)
{
//SPI_InitTypeDef SPI_InitStruct;
GPIO_InitTypeDef GPIO_InitStructure;
//使用SPI2控制74HC595D,进而实现对LED的控制
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC |RCC_AHB1Periph_GPIOE,ENABLE); //管脚时钟
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // WDI 外部看门引脚PC0
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; // POWERONRelay PC4
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //mcuLED
GPIO_Init(GPIOE, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; // SPI2_SRCLR
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; // SPI2_CLK
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14; // SPI2_SLD 这个引脚需要注意
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; //SPI2_MOSI
GPIO_Init(GPIOB, &GPIO_InitStructure);
//GPIO_ResetBits(GPIOB,GPIO_Pin_12);
GPIO_SetBits(GPIOB,GPIO_Pin_12); // SPI2_SRCLR 一直保持高电平
}
void LED_SendByte(u8 byte)//写一个字节的数据
{
char j,i;
GPIO_SetBits(GPIOB,GPIO_Pin_13);
for(i=0;i<8;i++)//循环8次把编码传给锁存器
{
j=byte&0x01; //低位在前 ,
if(0==j)
{
GPIO_ResetBits(GPIOB,GPIO_Pin_15); //SPI2_MOSI
}else
{
GPIO_SetBits(GPIOB,GPIO_Pin_15);
}
// R=j;
byte=byte>>1; //右移一位,取出该字节最低位
//R=CY; //将该字节最低位传给R
GPIO_ResetBits(GPIOB,GPIO_Pin_14); // SPI2_SLD
delay_ms(2);
GPIO_SetBits(GPIOB,GPIO_Pin_14); // SPI2_SLD //将数据移入595 ,上升沿
delay_ms(2);
// CLK=1;
} //将数据写入74HC595D,暂不输出
}
在main函数你反复调用
LED_SendByte(0X55);
GPIO_ResetBits(GPIOB,GPIO_Pin_13); // SPI2_CLK
delay_ms(2);
GPIO_SetBits(GPIOB,GPIO_Pin_13);
我理解的74hc595D的操作过程是:
数据在SCK的上升沿通过SER引脚输入
在SRCK上升沿输出,
使用示波器测试74HC595的输出,全部是低电平,
请问是哪里问题
注意 SPI2_SLD 是和595的CLK连在一起的
|