野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 13330|回复: 1

关于stm32F1模拟spi的问题

[复制链接]
发表于 2016-8-29 20:06:47 | 显示全部楼层 |阅读模式
最近突然想弄下模拟spi所以就结合了火哥的硬件spi读flash和液晶驱动两个程序弄出个残次品!就是一直读不对flash的设备id,读出来的是0xc2,实际是0x16,想请教下是哪点弄错了吗?小弟初学者,虚心求教!在此先谢谢了!

#include "spi.h"


static void DelayUS(vu32 cnt)
{
    uint16_t i;
    for(i = 0;i<cnt;i++)
    {
        uint8_t us = 12; /* 设置值为12,大约延1微秒 */   
        while (us--)     /* 延1微秒        */
        {
            ;   
        }
    }
}

void GPIO_SPI_Config(void)
{
  GPIO_InitTypeDef  GPIO_InitStructure;

  /* 开启GPIO时钟 */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

  /* 模拟SPI GPIO初始化 */         
  GPIO_InitStructure.GPIO_Pin=SPI_CLK_PIN;
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz ;         
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
  GPIO_Init(SPI_CLK_PORT, &GPIO_InitStructure);

  GPIO_InitStructure.GPIO_Pin = SPI_MOSI_PIN;
  GPIO_Init(SPI_MOSI_PORT, &GPIO_InitStructure);

  GPIO_InitStructure.GPIO_Pin = SPI_MISO_PIN;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz ;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;      
  GPIO_Init(SPI_MISO_PORT, &GPIO_InitStructure);

  GPIO_InitStructure.GPIO_Pin = SPI_CS_PIN;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz ;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;      
  GPIO_Init(SPI_CS_PORT, &GPIO_InitStructure);
   

        GPIO_ResetBits(SPI_CS_PORT,SPI_CS_PIN);//拉低片选

}

static void SPI_WriteCmd(unsigned char cmd)
{
    unsigned char buf;
    unsigned char i;
    SPI_DIN(0);
    SPI_DCLK(0);
    for(i=0;i<8;i++)
    {
        buf=(cmd>>(7-i))&0x1;
        SPI_DIN(buf);
      DelayUS(5);
        SPI_DCLK(1);
      DelayUS(5);
        SPI_DCLK(0);
    }
}


static unsigned short SPI_ReadCmd(void)
{
    unsigned short buf=0,temp;
    unsigned char i;
    SPI_DIN(0);
    SPI_DCLK(1);
    for(i=0;i<8;i++)
    {
        SPI_DCLK(0);         
        temp= (SPI_DOUT) ? 1:0;
        buf|=(temp<<(7-i));
        SPI_DCLK(1);
    }
    buf&=0x0fff;

    return(buf);
}
unsigned short SPI_Read(uint8_t dt)
{


    SPI_WriteCmd(dt);

        return SPI_ReadCmd();
}

u32 SPI_FLASH_ReadDeviceID(void)
{
  u32 Temp = 0;

  /* Select the FLASH: Chip Select low */
  GPIO_ResetBits(SPI_CS_PORT,SPI_CS_PIN);

  /* Send "RDID " instruction */
  SPI_Read(0xAB);
  SPI_Read(0xFF);
  SPI_Read(0xFF);
  SPI_Read(0xFF);
  
  /* Read a byte from the FLASH */
  Temp = SPI_Read(0xFF);

  /* Deselect the FLASH: Chip Select high */
  GPIO_SetBits(SPI_CS_PORT,SPI_CS_PIN);

  return Temp;
}
回复

使用道具 举报

发表于 2016-8-29 22:16:36 来自手机 | 显示全部楼层
有关模拟SPI的程序参考霸道液晶触摸的历程,触摸用的就是模拟SPI
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-23 10:47 , Processed in 0.051191 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表