|

楼主 |
发表于 2024-6-14 17:32:16
|
显示全部楼层
对于这个例程 我有点问题啊 ,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;
}
|
|