void eeprom_page_write(unsigned char adress,unsigned char *data,unsigned char num) { I2CStart(); I2CSendByte(0xa0); I2CWaitAck(); I2CSendByte(adress); I2CWaitAck(); while(num--) { I2CSendByte(*data++); I2CWaitAck(); } I2CStop(); }
收藏0 举报
#include "i2c.h" #define DELAY_TIME 20 /** * [url=home.php?mod=space&uid=247401]@brief[/url] SDA线输入模式配置 * @param None * @retval None */ void SDA_Input_Mode() { GPIO_InitTypeDef GPIO_InitStructure = {0}; GPIO_InitStructure.Pin = GPIO_PIN_7; GPIO_InitStructure.Mode = GPIO_MODE_INPUT; GPIO_InitStructure.Pull = GPIO_PULLUP; GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOB, &GPIO_InitStructure); } /** * @brief SDA线输出模式配置 * @param None * @retval None */ void SDA_Output_Mode() { GPIO_InitTypeDef GPIO_InitStructure = {0}; GPIO_InitStructure.Pin = GPIO_PIN_7; GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_OD; GPIO_InitStructure.Pull = GPIO_NOPULL; GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOB, &GPIO_InitStructure); } /** * @brief SDA线输出一个位 * @param val 输出的数据 * @retval None */ void SDA_Output( uint16_t val ) { if ( val ) { GPIOB->BSRR |= GPIO_PIN_7; } else { GPIOB->BRR |= GPIO_PIN_7; } } /** * @brief SCL线输出一个位 * @param val 输出的数据 * @retval None */ void SCL_Output( uint16_t val ) { if ( val ) { GPIOB->BSRR |= GPIO_PIN_6; } else { GPIOB->BRR |= GPIO_PIN_6; } } /** * @brief SDA输入一位 * @param None * @retval GPIO读入一位 */ uint8_t SDA_Input(void) { if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_7) == GPIO_PIN_SET){ return 1; }else{ return 0; } } /** * @brief I2C的短暂延时 * @param None * @retval None */ static void delay1(unsigned int n) { uint32_t i; for ( i = 0; i < n; ++i); } /** * @brief I2C起始信号 * @param None * @retval None */ void I2CStart(void) { SDA_Output(1); delay1(DELAY_TIME); SCL_Output(1); delay1(DELAY_TIME); SDA_Output(0); delay1(DELAY_TIME); SCL_Output(0); delay1(DELAY_TIME); } /** * @brief I2C结束信号 * @param None * @retval None */ void I2CStop(void) { SCL_Output(0); delay1(DELAY_TIME); SDA_Output(0); delay1(DELAY_TIME); SCL_Output(1); delay1(DELAY_TIME); SDA_Output(1); delay1(DELAY_TIME); } /** * @brief I2C等待确认信号 * @param None * @retval None */ unsigned char I2CWaitAck(void) { unsigned short cErrTime = 5; SDA_Input_Mode(); delay1(DELAY_TIME); SCL_Output(1); delay1(DELAY_TIME); while(SDA_Input()) { cErrTime--; delay1(DELAY_TIME); if (0 == cErrTime) { SDA_Output_Mode(); I2CStop(); return ERROR; } } SDA_Output_Mode(); SCL_Output(0); delay1(DELAY_TIME); return SUCCESS; } /** * @brief I2C发送确认信号 * @param None * @retval None */ void I2CSendAck(void) { SDA_Output(0); delay1(DELAY_TIME); delay1(DELAY_TIME); SCL_Output(1); delay1(DELAY_TIME); SCL_Output(0); delay1(DELAY_TIME); } /** * @brief I2C发送非确认信号 * @param None * @retval None */ void I2CSendNotAck(void) { SDA_Output(1); delay1(DELAY_TIME); delay1(DELAY_TIME); SCL_Output(1); delay1(DELAY_TIME); SCL_Output(0); delay1(DELAY_TIME); } /** * @brief I2C发送一个字节 * @param cSendByte 需要发送的字节 * @retval None */ void I2CSendByte(unsigned char cSendByte) { unsigned char i = 8; while (i--) { SCL_Output(0); delay1(DELAY_TIME); SDA_Output(cSendByte & 0x80); delay1(DELAY_TIME); cSendByte += cSendByte; delay1(DELAY_TIME); SCL_Output(1); delay1(DELAY_TIME); } SCL_Output(0); delay1(DELAY_TIME); } /** * @brief I2C接收一个字节 * @param None * @retval 接收到的字节 */ unsigned char I2CReceiveByte(void) { unsigned char i = 8; unsigned char cR_Byte = 0; SDA_Input_Mode(); while (i--) { cR_Byte += cR_Byte; SCL_Output(0); delay1(DELAY_TIME); delay1(DELAY_TIME); SCL_Output(1); delay1(DELAY_TIME); cR_Byte |= SDA_Input(); } SCL_Output(0); delay1(DELAY_TIME); SDA_Output_Mode(); return cR_Byte; } // void I2CInit(void) { GPIO_InitTypeDef GPIO_InitStructure = {0}; GPIO_InitStructure.Pin = GPIO_PIN_7 | GPIO_PIN_6; GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStructure.Pull = GPIO_PULLUP; GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOB, &GPIO_InitStructure); }
#ifndef __I2C_H #define __I2C_H #include "main.h" void I2CStart(void); void I2CStop(void); unsigned char I2CWaitAck(void); void I2CSendAck(void); void I2CSendNotAck(void); void I2CSendByte(unsigned char cSendByte); unsigned char I2CReceiveByte(void); void I2CInit(void); #endif
MX_GPIO_Init(); MX_TIM3_Init(); I2CInit();
本版积分规则 发表回复 回帖并转播 回帖后跳转到最后一页
扫码关注 21ic 官方微信
扫码关注嵌入式微处理器
扫码关注电源系统设计
扫码关注21ic项目外包
扫码浏览21ic手机版
本站介绍 | 申请友情链接 | 欢迎投稿 | 隐私声明 | 广告业务 | 网站地图 | 联系我们 | 诚聘英才
京公网安备 11010802024343号