打印

有用过AT25128的大神讲解。

[复制链接]
3226|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
cherished|  楼主 | 2015-4-13 22:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近在用STM32做一个项目,其中要用SPI驱动AT25128,用示波器测了,SCK,MOSI,CS都对,但是在MISO这个引脚上面却始终没信号。不知为何。用过的大神讲解讲解。感激不尽啊。。。。

相关帖子

沙发
zhaoyu2005| | 2015-4-14 08:41 | 只看该作者
我觉得太简单了,不知道你卡在哪儿了,把spi配置程序,AT25的驱动程序贴上来看看。
先提几点看看:
1.SPI配置成0 或者 3模式
2.注意AT25128的地址、状态寄存器,也就是操作序列
3.MISO没信号可能是固定的0xff,新芯片默认 0xff

使用特权

评论回复
板凳
luofeng2g| | 2015-4-14 08:50 | 只看该作者
你所说的没信号可能是楼上说的,你试试读读ID,是否还是没有?

使用特权

评论回复
地板
jjjyufan| | 2015-4-14 08:59 | 只看该作者
我估计你MISO MOSI 与MCU接错了

使用特权

评论回复
5
jjjyufan| | 2015-4-14 09:00 | 只看该作者
MISO 主进从出
MOSI 主出从进

使用特权

评论回复
6
shell.albert| | 2015-4-14 09:10 | 只看该作者
MOSI和MISO是相对的,要交叉连接的。这个概念本来就参照物不同。

使用特权

评论回复
7
popeye021| | 2015-4-14 16:57 | 只看该作者
shell.albert 发表于 2015-4-14 09:10
MOSI和MISO是相对的,要交叉连接的。这个概念本来就参照物不同。

交叉连接就傻了吧

使用特权

评论回复
8
cherished|  楼主 | 2015-4-15 13:04 | 只看该作者
jjjyufan 发表于 2015-4-14 08:59
我估计你MISO MOSI 与MCU接错了

这个没接错。。。

使用特权

评论回复
9
cherished|  楼主 | 2015-4-15 13:06 | 只看该作者
zhaoyu2005 发表于 2015-4-14 08:41
我觉得太简单了,不知道你卡在哪儿了,把spi配置程序,AT25的驱动程序贴上来看看。
先提几点看看:
1.SPI配 ...

void eeprom_GPIOInit(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
SPI_InitTypeDef  SPI_InitStructure;
       
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);

GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE); //       

/*!< SPI_EEPROM_SPI Periph clock enable */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);       
       
         /*!< Configure SPI_EEPROM_SPI pins: SCK */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOB, &GPIO_InitStructure);

  /*!< Configure SPI_EEPROM_SPI pins: MISO */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
        //GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  GPIO_Init(GPIOB, &GPIO_InitStructure);

  /*!< Configure SPI_EEPROM_SPI pins: MOSI */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOB, &GPIO_InitStructure);

  /*!< Configure SPI_EEPROM_SPI_CS_PIN pin: SPI_EEPROM Card CS pin */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
       
        EEPROM_CS_H();
       
         /* SPI2 configuration */
  // AT25128: data input on the DIO pin is sampled on the rising edge of the CLK.
  // Data on the DO and DIO pins are clocked out on the falling edge of CLK.
  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_Low;
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_32;
  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
  SPI_InitStructure.SPI_CRCPolynomial = 7;
  SPI_Init(SPI2, &SPI_InitStructure);

  /* Enable SPI2  */
  SPI_Cmd(SPI2, ENABLE);
       
        delay_us(20);
        WRITE_EEPROM_STATUSREG(0x00);

}


void WRITE_EERPOM_ENABLE(void)
{
        while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_TXE) == 0) ;// Tx buffer isnot empty ,wait
  EEPROM_CS_L();
        delay_us(20);
        SPI_I2S_SendData(SPI2,WREN);
        while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_TXE) == 0) ;
        delay_us(20);
        EEPROM_CS_H();
                delay_us(20);


}

void WRITE_EERPOM_DISABLE(void)
{
        while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_TXE) == 0) ;
  EEPROM_CS_L();
        SPI_I2S_SendData(SPI2,WRDI);
        while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_TXE) == 0) ;
       
        EEPROM_CS_H();

}



u8 READ_EEPROM_STATUSREG(void)
{
        u16 eeprom_status_reg;
        while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_TXE) == 0) ;
  EEPROM_CS_L();
        SPI_I2S_SendData(SPI2,RDSR);
       
        while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_TXE) == 0);
       
        SPI_I2S_SendData(SPI2,0x0000); //send empty data,generate sclk
        while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_RXNE) == 0) ;
        eeprom_status_reg = SPI_I2S_ReceiveData(SPI2);
       
  EEPROM_CS_H();
       
        return (u8)eeprom_status_reg;
}

//

void WRITE_EEPROM_STATUSREG(u8 status_data)
{

  while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_TXE) == 0);
        EEPROM_CS_L();
        //WRITE_EERPOM_ENABLE();
        delay_us(20);
        SPI_I2S_SendData(SPI2,WRSR);
       
        while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_TXE) == 0);
        delay_us(20);
        SPI_I2S_SendData(SPI2,status_data);

        while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_TXE) == 0) ;
        delay_us(20);
        EEPROM_CS_H();

}

void WRITE_EEPROM_BYTE(u16 addr,u8 write_data)
{
//        u16 temp;
         //temp = (addr << 8);
   while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_TXE) == 0) ;
         
         WRITE_EERPOM_ENABLE();
        delay_us(20);
         EEPROM_CS_L();
        delay_us(20);
         SPI_I2S_SendData(SPI2,WRITE);
        while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_TXE) == 0);
        delay_us(20);
        SPI_I2S_SendData(SPI2,addr>>8);
        while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_TXE) == 0);
        delay_us(20);
        SPI_I2S_SendData(SPI2,addr);
        while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_TXE) == 0);
        delay_us(20);
        SPI_I2S_SendData(SPI2,write_data);
        while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_TXE) == 0);
       
        delay_us(20);
   EEPROM_CS_H();
                 delay_us(20);


}

u8 READ_EEPROM_BYTE(u16 addr)
{
  u16 temp, read_data;
       
        //temp = addr << 8;
        // WRITE_EERPOM_ENABLE();
        while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_TXE) == 0);
        EEPROM_CS_L();
        delay_us(20);
        SPI_I2S_SendData(SPI2,READ);
        while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_TXE) == 0);
        delay_us(20);
        SPI_I2S_SendData(SPI2,addr>>8);
        while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_TXE) == 0);
        delay_us(20);
        SPI_I2S_SendData(SPI2,addr);
        while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_TXE) == 0);
        delay_us(20);
        SPI_I2S_SendData(SPI2,0x00);//send empty data ,generate sclk
        while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_RXNE) == 0) ;
        delay_us(20);
        read_data = SPI_I2S_ReceiveData(SPI2);
        delay_us(20);
        EEPROM_CS_H();
                delay_us(20);

  return read_data;
}




使用特权

评论回复
10
cherished|  楼主 | 2015-4-15 13:07 | 只看该作者
zhaoyu2005 发表于 2015-4-14 08:41
我觉得太简单了,不知道你卡在哪儿了,把spi配置程序,AT25的驱动程序贴上来看看。
先提几点看看:
1.SPI配 ...

我是先写了数据进去,再读出来的。读不到数据。

使用特权

评论回复
11
zhaoyu2005| | 2015-4-15 15:37 | 只看该作者
cherished 发表于 2015-4-15 13:07
我是先写了数据进去,再读出来的。读不到数据。

你是用编程器写入的数据还是自己写的程序,如果是自己的程序写入,你得先确认写入正确

使用特权

评论回复
12
cherished|  楼主 | 2015-4-15 15:51 | 只看该作者
zhaoyu2005 发表于 2015-4-15 15:37
你是用编程器写入的数据还是自己写的程序,如果是自己的程序写入,你得先确认写入正确 ...

自己编程写入的,现在就是不知道读写程序对不对,但是时序都有了,不知为什么不读入写出都没反应

使用特权

评论回复
13
zhaoyu2005| | 2015-4-15 15:52 | 只看该作者
MISO配置错了,这个和SCK MOSI一起配置为GPIO_Mode_AF_PP,一次就配好了
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
   GPIO_Init(GPIOB, &GPIO_InitStructure);
其他的没看,先改完这个试试

使用特权

评论回复
14
zhaoyu2005| | 2015-4-15 15:56 | 只看该作者
你的写入序列不规范,正常需要先读芯片的状态字,然后根据状态字进行操作,看datasheet吧,

使用特权

评论回复
15
13095479060| | 2016-12-22 16:50 | 只看该作者
这个程序还有吗?发我一份我看看呗,现在也在搞这个。

使用特权

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

本版积分规则

个人签名:大家一起学习,互相交流。

20

主题

128

帖子

1

粉丝