#include "eeprom.h" uint8_t Tx1_Buffer[] = "3.14159265358978"; uint8_t Rx1_Buffer[BufferSize1] = ""; void ee_io_init(void) { GPIO_InitTypeDef GPIO_InitStruct; /* GPIO Ports Clock Enable */ __HAL_RCC_GPIOB_CLK_ENABLE(); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6|GPIO_PIN_7, GPIO_PIN_RESET); /*Configure GPIO pins : PB6 PB9 */ GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7; //PB6 PB7 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD; //��©��� GPIO_InitStruct.Pull = GPIO_NOPULL; //������ģʽ����Ϊ�Ȳ�����Ҳ������ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;//IO���ٶ����� HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); //��ʼ�� } static void i2c_delay(void) { uint8_t i; for (i = 0; i < 40; i++); } void i2c_start(void) { // ��SCL�ߵ�ƽʱ��SDA����һ�������ر�ʾI2C���������ź� I2C_SDA_1(); I2C_SCL_1(); i2c_delay(); I2C_SDA_0(); i2c_delay(); I2C_SCL_0(); i2c_delay(); } void i2c_stop(void) { // ��SCL�ߵ�ƽʱ��SDA����һ�������ر�ʾI2C����ֹͣ�ź� I2C_SDA_0(); I2C_SCL_1(); i2c_delay(); I2C_SDA_1(); i2c_delay(); } void i2c_sendbyte(uint8_t _ucByte) { uint8_t i; // �ȷ����ֽڵĸ�λbit7 for (i = 0; i < 8; i++) { if (_ucByte & 0x80) { I2C_SDA_1(); } else { I2C_SDA_0(); } i2c_delay(); I2C_SCL_1(); i2c_delay(); I2C_SCL_0(); if (i == 7) { I2C_SDA_1(); // �ͷ����� } _ucByte <<= 1; // ����һ��bit i2c_delay(); } } uint8_t i2c_readbyte(void) { uint8_t i; uint8_t value; /* ������1��bitΪ���ݵ�bit7 */ value = 0; for (i = 0; i < 8; i++) { value <<= 1; I2C_SCL_1(); i2c_delay(); if (I2C_SDA_READ()) { value++; } I2C_SCL_0(); i2c_delay(); } return value; } uint8_t i2c_waitack(void) { uint8_t re; I2C_SDA_1(); /* CPU�ͷ�SDA���� */ // i2c_Delay(); I2C_SCL_1(); /* CPU����SCL = 1, ��ʱ�����᷵��ACKӦ�� */ i2c_delay(); if (I2C_SDA_READ()) /* CPU��ȡSDA����״̬ */ { re = 1; } else { re = 0; } I2C_SCL_0(); i2c_delay(); return re; } void i2c_ack(void) { I2C_SDA_0(); /* CPU����SDA = 0 */ i2c_delay(); I2C_SCL_1(); /* CPU����1��ʱ�� */ i2c_delay(); I2C_SCL_0(); i2c_delay(); I2C_SDA_1(); /* CPU�ͷ�SDA���� */ } void i2c_nack(void) { I2C_SDA_1(); /* CPU����SDA = 1 */ i2c_delay(); I2C_SCL_1(); /* CPU����1��ʱ�� */ i2c_delay(); I2C_SCL_0(); i2c_delay(); } uint8_t i2c_checkdevice(uint8_t _Address) { uint8_t ucAck; if (I2C_SDA_READ() && I2C_SCL_READ()) { i2c_start(); /* ���������ź� */ /* �����豸��ַ+��д����bit��0 = w�� 1 = r) bit7 �ȴ� */ i2c_sendbyte(_Address | I2C_WR); ucAck = i2c_waitack(); /* ����豸��ACKӦ�� */ i2c_stop(); /* ����ֹͣ�ź� */ return ucAck; } return 1; /* I2C�����쳣 */ } uint8_t ee_checkok(void) { if (i2c_checkdevice(EE_DEV_ADDR) == 0) { return 1; } else { /* ʧ�ܺ��мǷ���I2C����ֹͣ�ź� */ i2c_stop(); return 0; } } uint8_t ee_writebytes(uint8_t *_pWriteBuf, uint16_t _usAddress, uint16_t _usSize) { uint16_t i,m; uint16_t usAddr; usAddr = _usAddress; for (i = 0; i < _usSize; i++) { /* �����͵�1���ֽڻ���ҳ���׵�ַʱ����Ҫ���·��������źź͵�ַ */ if ((i == 0) || (usAddr & (EE_PAGE_SIZE - 1)) == 0) { /*���ڣ�������ֹͣ�źţ������ڲ�д������*/ i2c_stop(); /* ͨ���������Ӧ��ķ�ʽ���ж��ڲ�д�����Ƿ����, һ��С�� 10ms CLKƵ��Ϊ200KHzʱ����ѯ����Ϊ30������ */ for (m = 0; m < 1000; m++) { /* ��1��������I2C���������ź� */ i2c_start(); /* ��2������������ֽڣ���7bit�ǵ�ַ��bit0�Ƕ�д����λ��0��ʾд��1��ʾ�� */ // #if EE_ADDR_A8 == 1 // i2c_SendByte(EE_DEV_ADDR | I2C_WR | ((_usAddress >> 7) & 0x0E)); /* �˴���дָ�� */ // #else i2c_sendbyte(EE_DEV_ADDR | I2C_WR); // #endif /* ��3��������һ��ʱ�ӣ��ж������Ƿ���ȷӦ�� */ if (i2c_waitack() == 0) { break; } } if (m == 1000) { goto cmd_fail; /* EEPROM����д��ʱ */ } /* ��4���������ֽڵ�ַ��24C02ֻ��256�ֽڣ����1���ֽھ͹��ˣ������24C04���ϣ���ô�˴���Ҫ���������ַ */ if (EE_ADDR_BYTES == 1) { i2c_sendbyte((uint8_t)usAddr); if (i2c_waitack() != 0) { goto cmd_fail; /* EEPROM������Ӧ�� */ } } else { i2c_sendbyte(usAddr >> 8); if (i2c_waitack()!= 0) { goto cmd_fail; /* EEPROM������Ӧ�� */ } i2c_sendbyte(usAddr); if (i2c_waitack() != 0) { goto cmd_fail; /* EEPROM������Ӧ�� */ } } } /* ��6������ʼд������ */ i2c_sendbyte(_pWriteBuf[i]); /* ��7��������ACK */ if (i2c_waitack() != 0) { goto cmd_fail; /* EEPROM������Ӧ�� */ } usAddr++; /* ��ַ��1 */ } /* ����ִ�гɹ�������I2C����ֹͣ�ź� */ i2c_stop(); /* ͨ���������Ӧ��ķ�ʽ���ж��ڲ�д�����Ƿ����, һ��С�� 10ms CLKƵ��Ϊ200KHzʱ����ѯ����Ϊ30������ */ for (m = 0; m < 1000; m++) { /* ��1��������I2C���������ź� */ i2c_start(); /* ��2������������ֽڣ���7bit�ǵ�ַ��bit0�Ƕ�д����λ��0��ʾд��1��ʾ�� */ #if EE_ADDR_A8 == 1 i2c_sendbyte(EE_DEV_ADDR | I2C_WR | ((_usAddress >> 7) & 0x0E)); /* �˴���дָ�� */ #else i2c_sendbyte(EE_DEV_ADDR | I2C_WR); /* �˴���дָ�� */ #endif /* ��3��������һ��ʱ�ӣ��ж������Ƿ���ȷӦ�� */ if (i2c_waitack() == 0) { break; } } if (m == 1000) { goto cmd_fail; /* EEPROM����д��ʱ */ } /* ����ִ�гɹ�������I2C����ֹͣ�ź� */ i2c_stop(); return 1; cmd_fail: /* ����ִ��ʧ�ܺ��мǷ���ֹͣ�źţ�����Ӱ��I2C�����������豸 */ /* ����I2C����ֹͣ�ź� */ i2c_stop(); return 0; } uint8_t ee_readbytes(uint8_t *_pReadBuf, uint16_t _usAddress, uint16_t _usSize) { uint16_t i; /* ���ô���EEPROM�漴��ȡָ�����У�������ȡ�����ֽ� */ /* ��1��������I2C���������ź� */ i2c_start(); /* ��2������������ֽڣ���7bit�ǵ�ַ��bit0�Ƕ�д����λ��0��ʾд��1��ʾ�� */ i2c_sendbyte(EE_DEV_ADDR | I2C_WR); /* �˴���дָ�� */ /* ��3��������ACK */ if (i2c_waitack() != 0) { goto cmd_fail; /* EEPROM������Ӧ�� */ } /* ��4���������ֽڵ�ַ��24C02ֻ��256�ֽڣ����1���ֽھ͹��ˣ������24C04���ϣ���ô�˴���Ҫ���������ַ */ if (EE_ADDR_BYTES == 1) { i2c_sendbyte((uint8_t)_usAddress); if (i2c_waitack() != 0) { goto cmd_fail; /* EEPROM������Ӧ�� */ } } else { i2c_sendbyte(_usAddress >> 8); if (i2c_waitack() != 0) { goto cmd_fail; /* EEPROM������Ӧ�� */ } i2c_sendbyte(_usAddress); if (i2c_waitack() != 0) { goto cmd_fail; /* EEPROM������Ӧ�� */ } } /* ��6������������I2C���ߡ����濪ʼ��ȡ���� */ i2c_start(); /* ��7������������ֽڣ���7bit�ǵ�ַ��bit0�Ƕ�д����λ��0��ʾд��1��ʾ�� */ i2c_sendbyte(EE_DEV_ADDR | I2C_RD); /* �˴���дָ�� */ /* ��8��������ACK */ if (i2c_waitack() != 0) { goto cmd_fail; /* EEPROM������Ӧ�� */ } /* ��9����ѭ����ȡ���� */ for (i = 0; i < _usSize; i++) { _pReadBuf[i] = i2c_readbyte(); /* ��1���ֽ� */ /* ÿ����1���ֽں���Ҫ����Ack�� ���һ���ֽڲ���ҪAck����Nack */ if (i != _usSize - 1) { i2c_ack(); /* �м��ֽڶ����CPU����ACK�ź�(����SDA = 0) */ } else { i2c_nack(); /* ���1���ֽڶ����CPU����NACK�ź�(����SDA = 1) */ } } /* ����I2C����ֹͣ�ź� */ i2c_stop(); return 1; /* ִ�гɹ� */ cmd_fail: /* ����ִ��ʧ�ܺ��мǷ���ֹͣ�źţ�����Ӱ��I2C�����������豸 */ /* ����I2C����ֹͣ�ź� */ i2c_stop(); return 0; } // m=ee_writebytes(Tx1_Buffer,0,BufferSize1); // printf("I2C_WriteByte %d %s\r\n",m,(uint8_t*)&Tx1_Buffer[0]); // m=ee_readbytes(Rx1_Buffer,0,BufferSize1); // printf("I2C_ReadByte %d %s\r\n",m,(uint8_t*)&Rx1_Buffer[0]); // printf(" Rx1_Buffer is:%s,\t the BufferSize1 is:%d\r\n",Rx1_Buffer,BufferSize1); uint8_t trans1[12]={0}; uint8_t trans2[12]={0}; void ee_writefloats(uint16_t _usAddress, float *wr_data) { // for(uint8_t i = 0;i<_usSize;i++) // { memcpy(trans1,wr_data, 4*(SECTION_NUM + 1)); ee_writebytes(trans1, _usAddress, 4*(SECTION_NUM + 1)); // } } void ee_readfloats(uint16_t _usAddress, float *rd_data) { // for(uint8_t i =0 ;i<_usSize;i++) // { ee_readbytes(trans2, _usAddress, 4*(SECTION_NUM + 1)); memcpy(rd_data,&trans2, 4*(SECTION_NUM + 1)); // } }