打印

百思不得其解!!用spi驱动74HC595扩展IO一个奇怪的问题??

[复制链接]
6142|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
stm32 的spi 设置如下  
   SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
   SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
   SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
   SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;  ///SPI_CPOL_High sck 空闲时 为高电平
   SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;//在sck第一个跳沿对输入 输出数据采样
   SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
   SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_128;//需要考虑芯片的速度
   SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;


发送程序 如下
while(1){
       LowSpiLatch();
        while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
          SPI2->DR = 0x88;//(u16)(SPI_OutExpland>>16) ;                //输出到扩展IO,先发低16位
            /* Wait for SPI2 Tx buffer empty */
          while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
        SPI2->DR = 0x11;                //输出到扩展IO,先发低16位
          if(TypeMode==General_IO)
        Hight_Latch_O;//the 595 need a positive-going signel

}
输出应该是DO1~DO2=0x11   ; DO1~DO2=0x88;
但是输出时DO1~DO2=0xC4   ; DO1~DO2=0x01;
即整个32bit 循环右移动了一位,是什么导致这样的呢???

       

mcu.jpg (113.33 KB )

stm32出来接个8050三极管

stm32出来接个8050三极管

595.jpg (153.18 KB )

三极管的集极直接接595

三极管的集极直接接595

相关帖子

沙发
2009chinalj|  楼主 | 2013-5-27 14:42 | 只看该作者
以前只是没加三极管时用spi +595 扩展都没什么问题,测试时坏了好几个595,但是目前看应该不是595的问题

使用特权

评论回复
板凳
ayb_ice| | 2013-5-27 15:23 | 只看该作者
多看时序开始与结尾信号

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
2009chinalj + 3 赞一个!
地板
2009chinalj|  楼主 | 2013-5-27 17:50 | 只看该作者
收尾的时序不对,但是spi单次16bit发送时不会出现这个问题,有眉目了

使用特权

评论回复
5
gx_huang| | 2013-5-27 18:00 | 只看该作者
注意三极管电路的开关频率,太快就不行了。

使用特权

评论回复
6
huangxz| | 2013-5-27 18:08 | 只看该作者
为啥要加三极管?直接连接有什么问题么

使用特权

评论回复
7
2009chinalj|  楼主 | 2013-5-28 13:42 | 只看该作者
huangxz 发表于 2013-5-27 18:08
为啥要加三极管?直接连接有什么问题么

直接驱动上门者四个595是没问题的,但是我还有其它ic挂在spi上,不加三极管,驱动能力恐怕不够

使用特权

评论回复
8
2009chinalj|  楼主 | 2013-5-28 13:44 | 只看该作者
gx_huang 发表于 2013-5-27 18:00
注意三极管电路的开关频率,太快就不行了。

SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_128;//需要考虑芯片的速度

最低速了,对8050而已没什么问题

使用特权

评论回复
9
gx_huang| | 2013-5-28 14:43 | 只看该作者
三极管对CLK反向了,注意初始化程序中CLK的锁存极性,极性错了,就相当于移位了一bit。

使用特权

评论回复
10
2009chinalj|  楼主 | 2013-5-29 21:51 | 只看该作者
gx_huang 发表于 2013-5-28 14:43
三极管对CLK反向了,注意初始化程序中CLK的锁存极性,极性错了,就相当于移位了一bit。 ...

谢谢,问题已解决

使用特权

评论回复
11
tuzihog| | 2014-3-6 20:42 | 只看该作者
关注一下

使用特权

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

本版积分规则

个人签名:改变这个世界的不是MBA是工程师。。其实我是一名电工

13

主题

177

帖子

0

粉丝