我用STM32F4集成一個國產的交換機芯片,對方提供了SDK,但集成的時候需要自己開發API函式,如下面的Master_Read2Byte介面函式
void fun_regist()
{
m_fun.iic_read = Master_Read2Byte;
m_fun.iic_write = Master_Write2Byte;
m_fun.spi_read = switchchip_read;
m_fun.spi_write = switchchip_write;
m_fun.mdio_read = mdiobb_read;
m_fun.mdio_write = mdiobb_write;
m_fun.eeprom_read = AT24CXX_Read;
m_fun.eeprom_write = AT24CXX_Write;
}
這個是對應的結構體
typedef struct user_mgmt_fun_s
{
// unsigned short (*iic_read)(l2sw_uint32 I2Cx, l2sw_uint16 ReadAddr, l2sw_uint16 *ReadBuff);
int (*iic_read)(l2sw_uint32 I2Cx, l2sw_uint8 SlaveAddr, l2sw_uint16 ReadAddr, l2sw_uint16 *ReadBuff);
int (*iic_write)(l2sw_uint32 I2Cx, l2sw_uint8 SlaveAddr, l2sw_uint16 WriteAddr, l2sw_uint16 DataToWrite);
int (*spi_read)(l2sw_uint32 SPIx, l2sw_uint16 ReadAddr, l2sw_uint8 *pBuffer, l2sw_uint16 NumByteToRead);
int (*spi_write)(l2sw_uint32 SPIx, l2sw_uint16 WriteAddr, l2sw_uint8 *pBuffer, l2sw_uint16 NumByteToWrite);
int (*mdio_read)(l2sw_uint32 MDIOx, l2sw_uint32 phy, l2sw_uint32 reg, l2sw_uint16 *val);
int (*mdio_write)(l2sw_uint32 MDIOx, l2sw_uint32 phy, l2sw_uint32 reg, l2sw_uint16 val);
int (*eeprom_read)(l2sw_uint32 I2Cx, l2sw_uint8 SlaveAddr, l2sw_uint8 ReadAddr, l2sw_uint32 num_to_read, l2sw_uint8 *ReadBuff);
int (*eeprom_write)(l2sw_uint32 I2Cx, l2sw_uint8 SlaveAddr, l2sw_uint8 WriteAddr, l2sw_uint32 num_to_write, l2sw_uint8 *DataToWrite);
}user_mgmt_fun_t;
這個是我自己寫的介面函式
uint32_t Master_Read2Byte(uint8_t I2C_SLAVE_ADDR, uint16_t ReadAddr, uint16_t *ReadBuff)
{
uint8_t addr_high=0;
uint8_t addr_low=0;
addr_high=ReadAddr>>8;
addr_low=ReadAddr<<8;
uint16_t temp=0;
IIC_Start();
IIC_Send_Byte(I2C_SLAVE_ADDR); //發送器件地址0X5C,寫資料
IIC_Wait_Ack();
IIC_Send_Byte(addr_high%256); //發送高位地址
IIC_Wait_Ack();
IIC_Send_Byte(addr_low%256); //發送高位地址
IIC_Wait_Ack();
IIC_Start();
IIC_Send_Byte(I2C_SLAVE_ADDR+1); //進入接收模式
IIC_Wait_Ack();
temp=IIC_Read_Byte(0)>>8;
IIC_Wait_Ack();
IIC_Send_Byte(I2C_SLAVE_ADDR+1); //進入接收模式
IIC_Wait_Ack();
temp=IIC_Read_Byte(0)<<8;
IIC_Wait_Ack();
IIC_Stop();//產生一個停止條件
return temp;
}
void Master_Write2Byte(uint8_t I2C_SLAVE_ADDR, uint16_t WriteAddr, uint16_t DataToWrite)
{
uint16_t addr_high=0;
uint16_t addr_low=0;
addr_high=WriteAddr>>8;
addr_low=WriteAddr<<8;
IIC_Start();
IIC_Send_Byte(I2C_SLAVE_ADDR); //發送器件地址0X5C,寫資料
IIC_Wait_Ack();
IIC_Send_Byte(addr_high%256); //發送高位地址
IIC_Wait_Ack();
IIC_Send_Byte(addr_low%256); //發送低位地址
IIC_Wait_Ack();
IIC_Send_Byte((DataToWrite>>8)); //發送高位位元組
IIC_Wait_Ack();
IIC_Send_Byte((DataToWrite<<8)); //發送低位位元組
IIC_Wait_Ack();
IIC_Stop();//產生一個停止條件
delay_ms_1(10);
}
現在的問題是編譯后根本就通過不,Master_Read2Byte加上()也不行,請專家幫忙看看應該怎么改,非常感謝!
uj5u.com熱心網友回復:
Master_Read2Byte 輸入的引數和結構里定義的不一樣,少了一個 l2sw_uint32 I2Cxuint32_t Master_Read2Byte(uint8_t I2C_SLAVE_ADDR, uint16_t ReadAddr, uint16_t *ReadBuff)
int (*iic_read)(l2sw_uint32 I2Cx, l2sw_uint8 SlaveAddr, l2sw_uint16 ReadAddr, l2sw_uint16 *ReadBuff);
uj5u.com熱心網友回復:
我在函式Master_Read2Byte加了I2Cx編譯提示如下錯誤,還請幫忙指點一下,謝謝。
..\API_Source\smi.c(42): error: #513: a value of type "int" cannot be assigned to an entity of type "int (*)(l2sw_uint32, l2sw_uint8, l2sw_uint16, l2sw_uint16 *)"
m_fun.iic_read = Master_Read2Byte();
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/244447.html
標籤:單片機/工控
