新手入门
- 积分
- 14
- 金钱
- 14
- 注册时间
- 2021-12-9
- 在线时间
- 5 小时
|
2金钱
用的是f103zet6和AT24C02
//相关的宏定义
#define IIC_APBxClkCmd RCC_APB1PeriphClockCmd
#define IIC_GPIO_APBxCLKCmd RCC_APB2PeriphClockCmd
#define IIC_SCL_GPIO_CLK RCC_APB2Periph_GPIOB
#define IIC_SDA_GPIO_CLK RCC_APB2Periph_GPIOB
#define EEPROM_I2C I2C1
#define IIC_CLK RCC_APB1Periph_I2C1
#define IIC_SCL_GPIO_PIN GPIO_Pin_6
#define IIC_SDA_GPIO_Pin GPIO_Pin_7#define IIC_SCL_GPIO_PORT GPIOB
#define IIC_SDA_GPIO_PORT GPIOB
#define IIC_ClockSpeed_Config 400000
#define IIC_OwnAddress_Config 0x5f
#define EEPROM_WRITE_ADDRESS 0xA0 //1010000 0
#define EEPROM_READ_ADDRESS 0xA1 //1010000 1
/**
* @brief I2C-EEPROM INIT
* @param N
* @retval N
*/
static void IIC_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
I2C_InitTypeDef I2C_InitStructure;
/********************************RCC******************************/
IIC_GPIO_APBxCLKCmd(IIC_SCL_GPIO_CLK | IIC_SDA_GPIO_CLK,ENABLE); //GPIO
IIC_APBxClkCmd(IIC_CLK,ENABLE); //I2C
/********************************GPIO******************************/
GPIO_InitStructure.GPIO_Pin=IIC_SCL_GPIO_PIN; //SCL,i2c1为PIN6
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_OD;
GPIO_Init(IIC_SCL_GPIO_PORT,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=IIC_SDA_GPIO_Pin; //SDA,i2c1为PIN7 GPIO_Init(IIC_SDA_GPIO_PORT,&GPIO_InitStructure);
/********************************IIC******************************/
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; //ACK使能
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; //I2C寻址模式
I2C_InitStructure.I2C_ClockSpeed = IIC_ClockSpeed_Config; //通信速率
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2; //占空比
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C; //模式
I2C_InitStructure.I2C_OwnAddress1 = IIC_OwnAddress_Config; //I2C设备自身地址
I2C_Init(EEPROM_I2C,&I2C_InitStructure); //初始化
I2C_Cmd(EEPROM_I2C,ENABLE); //使能,EEPROM_I2C==I2C1
}
/**
* @brief I2C-EEPROM page Write
* @param addr: EEPROM addr
* @param data: page address
* @param numByte: num of data(numByte<=8)
* @retval none
*/
void EEPROM_Page_Write(uint8_t addr,uint8_t *data,uint8_t numByte)
{
// 1 start writing
I2C_GenerateSTART(EEPROM_I2C,ENABLE);
while(I2C_CheckEvent(EEPROM_I2C,I2C_EVENT_MASTER_MODE_SELECT)==ERROR); //EV5
// 2 device address
I2C_Send7bitAddress(EEPROM_I2C,EEPROM_WRITE_ADDRESS,I2C_Direction_Transmitter);
while(I2C_CheckEvent(EEPROM_I2C,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)==ERROR); //EV6
// 3 word address
I2C_SendData(EEPROM_I2C,addr);
while(I2C_CheckEvent(EEPROM_I2C,I2C_EVENT_MASTER_BYTE_TRANSMITTING )==ERROR); //EV8
// 4 data
while(numByte--)
{
I2C_SendData(EEPROM_I2C,*data);
while(I2C_CheckEvent(EEPROM_I2C,I2C_EVENT_MASTER_BYTE_TRANSMITTING )==ERROR); //EV8
data++;
}
// 5 Finish
I2C_GenerateSTOP(EEPROM_I2C,ENABLE);
}
/**
* @brief 从EEPROM接收数据
* @param addr: EEPROM addr
* @param *data: reading buffer addr
* @retval N
*/
void EEPROM_Read(uint8_t addr,uint8_t *data,uint8_t dataNumByteRead)
{
// 1 start writing
I2C_GenerateSTART(EEPROM_I2C,ENABLE);
while(I2C_CheckEvent(EEPROM_I2C,I2C_EVENT_MASTER_MODE_SELECT)==ERROR); //EV5
// 2 device address
I2C_Send7bitAddress(EEPROM_I2C,EEPROM_WRITE_ADDRESS,I2C_Direction_Transmitter);
while(I2C_CheckEvent(EEPROM_I2C,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)==ERROR); //EV6
// 3 word address
I2C_SendData(EEPROM_I2C,addr);
while(I2C_CheckEvent(EEPROM_I2C,I2C_EVENT_MASTER_BYTE_TRANSMITTING )==ERROR); //EV7
// 4 strat reading
I2C_GenerateSTART(EEPROM_I2C,ENABLE);
while(I2C_CheckEvent(EEPROM_I2C,I2C_EVENT_MASTER_MODE_SELECT)==ERROR); //EV5
// 5 device address
I2C_Send7bitAddress(EEPROM_I2C,EEPROM_READ_ADDRESS,I2C_Direction_Receiver);
while(I2C_CheckEvent(EEPROM_I2C,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)==ERROR); //EV6
// 6 receive data
while(dataNumByteRead)
{
//如果是最后一个字节
if(dataNumByteRead==1)
{
I2C_AcknowledgeConfig(EEPROM_I2C,DISABLE);
}
while(I2C_CheckEvent(EEPROM_I2C,I2C_EVENT_MASTER_BYTE_RECEIVED )==ERROR); //EV7
*data=I2C_ReceiveData(EEPROM_I2C);
data++;
dataNumByteRead--;
}
I2C_GenerateSTOP(EEPROM_I2C,ENABLE);
}
uint8_t readData[8]={0};
uint8_t I2C_data[8]={1,2,3,4,5,6,7,8};
结果只能输出1,后面的数都是0xff
|
|