硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1348|回复: 4
收起左侧

STM32g474驱动M93C56

[复制链接]

6

主题

7

回帖

25

积分

新手上路

积分
25
发表于 2024-6-7 15:24:59 | 显示全部楼层 |阅读模式





void M93c56_Write(uint8_t* pBuffer,uint8_t WriteAddr,uint8_t NumByteToRead)
{
        uint16_t i;

#if 0    //一个字节写
         M93c56_WriteEnableCmd();
     M93C56_ENABLE();     //使能从设备,置高
         SPI2_ReadWriteByte(M93C56_WRITE_CMD);      //发送写命令 00x0A  0000 1010 0000 0000
         SPI2_ReadWriteByte(WriteAddr);  //发送写地址
         SPI2_ReadWriteByte(pBuffer[0]);  //发送写数据
         M93C56_DISABLE();     //使能从设备,置低
         osDelay(5);
     M93C56_ENABLE();     //使能从设备,置高
         osDelay(10);
         M93C56_DISABLE();     //使能从设备,置低
     M93c56_WriteDisableCmd();
#endif


     M93c56_WriteEnableCmd();       //写多个字节
     M93C56_ENABLE();     //使能从设备,置高
     SPI2_ReadWriteByte(M93C56_WRITE_CMD);      //发送写命令 00x0A  0000 1010 0000 0000
     SPI2_ReadWriteByte(WriteAddr);  //发送写地址
     for(i=0;i<NumByteToRead;i++)
     {
       SPI2_ReadWriteByte(pBuffer[i]);

     }
     M93C56_DISABLE();     //使能从设备,置低
     osDelay(5);
     M93C56_ENABLE();     //使能从设备,置高
     osDelay(10);
     M93C56_DISABLE();     //使能从设备,置低
     M93c56_WriteDisableCmd();


}



static uint8_t SPI2_ReadWriteByte(uint8_t TxData)
{
uint8_t RxData;

HAL_SPI_TransmitReceive(&hspi2,&TxData,&RxData,1, 1000);

return RxData; //返回收到的数据
}



static void M93c56_WriteEnableCmd()
{

  M93C56_ENABLE();     //使能从设备,置高 0x09 0x80
  SPI2_ReadWriteByte(M93C56_WRITEEN_CMD);
  SPI2_ReadWriteByte(M93C56_WRITEEN_Add);
  M93C56_DISABLE();
}

static void M93c56_WriteDisableCmd()
{
          M93C56_ENABLE();     //使能从设备,置高 0x08 0x00
          SPI2_ReadWriteByte(M93C56_WRITEDISEN_CMD);
          SPI2_ReadWriteByte(M93C56_WRITEDISEN_Add);
          M93C56_DISABLE();

}


这样写有问题吗?写的时候有busy和ready判断,做了延时,没做判断,然后这个时序是写一个字节还是多个字节没看明白?



写时序图

写时序图
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116231
QQ
发表于 2024-6-8 01:28:40 | 显示全部楼层
回复

使用道具 举报

6

主题

7

回帖

25

积分

新手上路

积分
25
 楼主| 发表于 2024-6-14 17:32:16 | 显示全部楼层
eric2013 发表于 2024-6-8 01:28
这个ST提供驱动了

https://www.st.com/en/evaluation-tools/x-nucleo-eeprma2.html#tools-software

对于这个例程 我有点问题啊 ,SPI通讯读取数据时候要先发送空字节过去呼唤,才会回复数据,为什么例程钟直接接收数据呢,如下
/**
  * @brief  Read data, at specific address, through spi to the M95xx
  * @param  pData: pointer to the data to read
  * @param  TarAddr : I2C data memory address to write
  * @param  DevAddr : Target device address
  * @param  Size : Size in bytes of the value to be written
  * @param  Inst : SPI instruction
  * @retval EEPROMEX enum status
  */
int32_t EEPRMA2_SPI_RecvBuffer(uint8_t * pData, uint32_t TarAddr,
                               uint32_t DevAddr, const uint16_t Size, const uint8_t Inst )
{
  EEPROMEX_CTRL_LOW( (uint8_t)DevAddr & EEPROMEX_SPI_SLAVESEL );
  if (EEPRMA2_M95_IOWrite(Inst) != BSP_ERROR_NONE)     
    return BSP_ERROR_COMPONENT_FAILURE;
  if (EEPRMA2_M95_WriteAddr(TarAddr, DevAddr) != BSP_ERROR_NONE )
    return BSP_ERROR_COMPONENT_FAILURE;
  if (EEPRMA2_SPI_RECV( pData, Size ) != BSP_ERROR_NONE )
    return BSP_ERROR_COMPONENT_FAILURE;
  EEPROMEX_CTRL_HIGH( (uint8_t)DevAddr & EEPROMEX_SPI_SLAVESEL );
  return BSP_ERROR_NONE;
}
先片选控制,然后发送读命令,再发送读地址,应该再发送空字节读取数据,这里为什么没有发送空字节呢?
int32_t EEPRMA2_M95_IOWrite(uint8_t TxData )
{
  int32_t status = BSP_ERROR_NONE;
  status = EEPRMA2_SPI_SEND( &TxData, 1);
  return status;
}
#define EEPRMA2_SPI_SEND         BSP_SPI1_Send
int32_t EEPRMA2_M95_WriteAddr( const uint32_t TarAddr, const uint32_t DevAddr)
{
  uint8_t AddrSize;
  static uint8_t Addr[3];
  uint8_t count, temp;
  uint32_t addrpacket = TarAddr;
  AddrSize = ( (uint8_t)DevAddr & EEPROMEX_SPI_ADDRSEL ) >> EEPROMEX_SPI_ADDRSHIFT;
  for (count = AddrSize; count > 0U; count--){
    temp = (uint8_t)( addrpacket & 0xFFU );
    Addr[count - 1U] = temp;
    addrpacket = addrpacket >> 8U;
  }
  return  EEPRMA2_SPI_SEND( Addr, AddrSize );
}

#define EEPRMA2_SPI_RECV         BSP_SPI1_Recv
int32_t  BSP_SPI1_Recv(uint8_t *pData, uint16_t Length)
{
  int32_t ret = BSP_ERROR_NONE;

  if(HAL_SPI_Receive(&hspi1, pData, Length, BUS_SPI1_POLL_TIMEOUT) != HAL_OK)
  {
      ret = BSP_ERROR_UNKNOWN_FAILURE;
  }
  return ret;
}

回复

使用道具 举报

6

主题

7

回帖

25

积分

新手上路

积分
25
 楼主| 发表于 2024-6-14 17:33:28 | 显示全部楼层
eric2013 发表于 2024-6-8 01:28
这个ST提供驱动了

https://www.st.com/en/evaluation-tools/x-nucleo-eeprma2.html#tools-software

对于这个例程 我有点问题啊 ,SPI通讯读取数据时候要先发送空字节过去呼唤,才会回复数据,为什么例程钟直接接收数据呢,如下
/**
  * @brief  Read data, at specific address, through spi to the M95xx
  * @param  pData: pointer to the data to read
  * @param  TarAddr : I2C data memory address to write
  * @param  DevAddr : Target device address
  * @param  Size : Size in bytes of the value to be written
  * @param  Inst : SPI instruction
  * @retval EEPROMEX enum status
  */
int32_t EEPRMA2_SPI_RecvBuffer(uint8_t * pData, uint32_t TarAddr,
                               uint32_t DevAddr, const uint16_t Size, const uint8_t Inst )
{
  EEPROMEX_CTRL_LOW( (uint8_t)DevAddr & EEPROMEX_SPI_SLAVESEL );
  if (EEPRMA2_M95_IOWrite(Inst) != BSP_ERROR_NONE)     
    return BSP_ERROR_COMPONENT_FAILURE;
  if (EEPRMA2_M95_WriteAddr(TarAddr, DevAddr) != BSP_ERROR_NONE )
    return BSP_ERROR_COMPONENT_FAILURE;
  if (EEPRMA2_SPI_RECV( pData, Size ) != BSP_ERROR_NONE )
    return BSP_ERROR_COMPONENT_FAILURE;
  EEPROMEX_CTRL_HIGH( (uint8_t)DevAddr & EEPROMEX_SPI_SLAVESEL );
  return BSP_ERROR_NONE;
}
先片选控制,然后发送读命令,再发送读地址,应该再发送空字节读取数据,这里为什么没有发送空字节呢?
int32_t EEPRMA2_M95_IOWrite(uint8_t TxData )
{
  int32_t status = BSP_ERROR_NONE;
  status = EEPRMA2_SPI_SEND( &TxData, 1);
  return status;
}
#define EEPRMA2_SPI_SEND         BSP_SPI1_Send
int32_t EEPRMA2_M95_WriteAddr( const uint32_t TarAddr, const uint32_t DevAddr)
{
  uint8_t AddrSize;
  static uint8_t Addr[3];
  uint8_t count, temp;
  uint32_t addrpacket = TarAddr;
  AddrSize = ( (uint8_t)DevAddr & EEPROMEX_SPI_ADDRSEL ) >> EEPROMEX_SPI_ADDRSHIFT;
  for (count = AddrSize; count > 0U; count--){
    temp = (uint8_t)( addrpacket & 0xFFU );
    Addr[count - 1U] = temp;
    addrpacket = addrpacket >> 8U;
  }
  return  EEPRMA2_SPI_SEND( Addr, AddrSize );
}

#define EEPRMA2_SPI_RECV         BSP_SPI1_Recv
int32_t  BSP_SPI1_Recv(uint8_t *pData, uint16_t Length)
{
  int32_t ret = BSP_ERROR_NONE;

  if(HAL_SPI_Receive(&hspi1, pData, Length, BUS_SPI1_POLL_TIMEOUT) != HAL_OK)
  {
      ret = BSP_ERROR_UNKNOWN_FAILURE;
  }
  return ret;
}

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116231
QQ
发表于 2024-6-15 09:06:02 | 显示全部楼层
zhangtingxcy 发表于 2024-6-14 17:33
对于这个例程 我有点问题啊 ,SPI通讯读取数据时候要先发送空字节过去呼唤,才会回复数据,为什么例程钟 ...

没用过这个芯片
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-6-11 07:29 , Processed in 0.246389 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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