在线时间765 小时
UID3530145
ST金币5114
蝴蝶豆59
注册时间2018-12-24
该用户从未签到
论坛元老
- 最后登录
- 2021-7-29
|
之前完成了GPIO模拟I2C驱动DS1307和AT24C32之后,便继续测试如何使用硬件I2C。在热心版主和坛友的帮助下,经过几天的反复测试,硬件I2C也基本完成,在阻塞方式下完成了对DS1307和AT24C32的操作,下图为测试过程:
屏幕下部的日期和时间是从DS1307芯片读取的,利用systick的毫秒中断进行秒计时,每分钟读取一次DS1307的日期数据,并用秒、分、时数据对AT24C32进行一次先读后写的操作,读出的数据(也就是上次写入的数据)显示在倒数第三行,当前写入的数据显示在倒数第二行。对DS1307读取数据交替采用HAL_I2C_Master_Receive()和HAL_I2C_Mem_Read()函数,读写的代码如下:
- /******************************************************************************************
- * 函数名称: DS1307_I2C_Transmit(uint8_t size)
- * 功能说明: 写数据到DS1307
- * 输 入: size 数据个数(要写入数据在全局数组DS_Buff中)
- * 输 出: 0 = 成功写入 1 = 写数据过程中出现错误
- ******************************************************************************************/
- uint8_t DS1307_I2C_Transmit(uint8_t size)
- {
- uint8_t addr = 0;
- DS1307_DataToBuff(); //将时间及日期数据转换到Buff数组中
- HAL_I2C_Master_Transmit(&hi2c1,0xD0,&addr,1,10000);//发送起始地址
-
- if(HAL_I2C_Master_Transmit(&hi2c1,0xD0,(uint8_t*)DS_Buff ,size,10000) != HAL_OK)
- {
- return 1;
- }
- return 0;
- }
- /******************************************************************************************
- * 函数名称: DS1307_I2C_Receive(uint8_t size)
- * 功能说明: 从DS1307读出数据
- * 输 入: size 数据个数(读出的数据在全局数组DS_Buff中)
- * 输 出: 0 = 成功读出 1 = 读数据过程中出现错误
- ******************************************************************************************/
- uint8_t DS1307_I2C_Receive(uint8_t size)
- {
- uint8_t addr = 0;
- HAL_I2C_Master_Transmit(&hi2c1,0xD0,&addr,1,10000);//发送起始地址
-
- if(HAL_I2C_Master_Receive(&hi2c1,0xD0,DS_Buff,7,10000) != HAL_OK)
- {
- return 1;
- }
- if(size == 1){ //检查DS1307是否需要初始化
- if(DS_Buff[0]>127){
- year = 2019;
- month = 9;
- day = 18;
- week = 3;
- hour = 9;
- minute = 1;
-
- DS1307_DataToBuff();
- DS1307_I2C_Transmit(8);
- }
- }
- else{
- DS1307_BuffToData();
- }
- return 0;
- }
-
- /******************************************************************************************
- * 函数名称: DS1307_I2C_Read()
- * 功能说明: 读DS1307的日历数据,并转换为各自的变量值
- * 输 入: 无
- * 输 出: 0 = 成功从DS1307获取数据 >0 = 从DS1307获取数据过程中出现错误
- ******************************************************************************************/
- void DS1307_I2C_Read(void)
- {
- while (HAL_I2C_Mem_Read(&hi2c1,0x00D0,0,I2C_MEMADD_SIZE_8BIT,(uint8_t*)DS_Buff,7,10000) != HAL_OK)
- // while (HAL_I2C_Master_Receive(&hi2c1, 0, (uint8_t *)DS_Buff, 7, 10000) != HAL_OK)
- {
- if (HAL_I2C_GetError(&hi2c1) != HAL_I2C_ERROR_AF)
- {
- LCD_write_ASCII(0,3,1,(uint8_t *)"DS_Read_Error!");
- }
- }
- DS1307_BuffToData();
-
- }
- /******************************************************************************************
- * 函数名称: DS1307_I2C_Write()
- * 功能说明: 将当前的日历数据写入DS1307
- * 输 入: 无
- * 输 出: 0 = 成功写入数据 >0 = DS1307写入数据过程中出现错误
- ******************************************************************************************/
- void DS1307_I2C_Write(void)
- {
- DS1307_DataToBuff(); //时间日期数据转换存入Buff数组中
-
- while (HAL_I2C_Mem_Write(&hi2c1,0x00D0,0,I2C_MEMADD_SIZE_8BIT,(uint8_t*)DS_Buff,7,10000) != HAL_OK)
- // while (HAL_I2C_Master_Transmit(&hi2c1, 0, (uint8_t *)DS_Buff, 7, 10000) != HAL_OK)
- {
- if (HAL_I2C_GetError(&hi2c1) != HAL_I2C_ERROR_AF)
- {
- LCD_write_ASCII(0,3,1,(uint8_t *)"DS_Write_Erro!");
- // return 2;
- }
- }
- // return 0;
- }
- /******************************************************************************************
- * 函数名称: DS1307_Chick()
- * 功能说明: 检查DS1307是否已经初始化,若未初始化则用特写日期进行初始化
- * 输 入: 无
- * 输 出: 无
- ******************************************************************************************/
- void DS1307_Check(void)
- {
- // LCD_write_ASCII(0,3,1,(uint8_t *)"Check_Begin...");
- while (HAL_I2C_Mem_Read(&hi2c1,0x00D0,0,I2C_MEMADD_SIZE_8BIT,(uint8_t*)DS_Buff,1,10000) != HAL_OK)
- while (HAL_I2C_Master_Receive(&hi2c1, 0, (uint8_t *)DS_Buff, 1, 10000) != HAL_OK)
- {
- if (HAL_I2C_GetError(&hi2c1) != HAL_I2C_ERROR_AF)
- {
- LCD_write_ASCII(0,3,1,(uint8_t *)"CheckReadErro!");
- }
- }
- LCD_write_value(0,4,3,0,1,DS_Buff[0]);
- if(DS_Buff[0]> 127){
- year = 2019;
- month = 9;
- day = 18;
- week = 3;
- hour = 9;
- minute = 1;
-
- DS1307_DataToBuff();
- while (HAL_I2C_Mem_Write(&hi2c1,0x00D0,0,I2C_MEMADD_SIZE_8BIT,(uint8_t*)DS_Buff,1,10000) != HAL_OK)
- // while (HAL_I2C_Master_Transmit(&hi2c1, 0, (uint8_t *)DS_Buff, 8, 10000) != HAL_OK)
- {
- if (HAL_I2C_GetError(&hi2c1) != HAL_I2C_ERROR_AF)
- {
- LCD_write_ASCII(0,3,1,(uint8_t *)"CheckWriteErr!");
- }
- }
- }
- }
- /******************************************************************************************
- * 函数名称: DS1307_DataToBuff()
- * 功能说明: 将时间日期变量数据转换到数组Buff中
- * 输 入: 无
- * 输 出: 无
- ******************************************************************************************/
- void DS1307_DataToBuff(void)
- {
- uint8_t temp;
- DS_Buff[0] = 0; //秒
- temp = ((minute/10)<<4|(minute%10));
- DS_Buff[1] = temp; //分
- temp = ((hour/10)<<4|(hour%10));
- DS_Buff[2] = temp; //时
- DS_Buff[3] = week; //星期
- temp = ((day/10)<<4|(day%10));
- DS_Buff[4] = temp; //日
- temp = ((month/10)<<4|(month%10));
- DS_Buff[5] = temp; //月
- temp = ((year%100)/10<<4|(year%10));
- DS_Buff[6] = temp; //年
- DS_Buff[7] = 32; //0010 0000 = 允许按1Hz输出方波
- }
- /******************************************************************************************
- * 函数名称: DS1307_BuffToData()
- * 功能说明: 将数组Buff数据转换到时间日期变量中
- * 输 入: 无
- * 输 出: 无
- ******************************************************************************************/
- void DS1307_BuffToData(void)
- {
- second = ((DS_Buff[0]&0x70)>>4)*10 + (DS_Buff[0]&0x0F);//秒,屏蔽秒的第7位的标志
- minute = ((DS_Buff[1]&0x70)>>4)*10 + (DS_Buff[1]&0x0F);//分(取低7位)
- hour = ((DS_Buff[2]&0x30)>>4)*10 + (DS_Buff[2]&0x0F); //时(取低5位)
- week = (DS_Buff[3]&0x07); //周(取低3位)
- day = ((DS_Buff[4]&0x30)>>4)*10 + (DS_Buff[4]&0x0F); //日(取低6位)
- month = ((DS_Buff[5]&0x10)>>4)*10 + (DS_Buff[5]&0x0F); //月(取低5位)
- year = 2000 + (DS_Buff[6]>>4)*10 + (DS_Buff[6]&0x0F); //年
- }
- /******************************************************************************************
- * 函数名称: AT24C32_I2C_Read()
- * 功能说明: 读取AT24C32的数据(存放在DS_Buff数组中)
- * 输 入: adrr(起始地址),size(读取的字节长度)
- * 输 出: 无
- ******************************************************************************************/
- void AT24C32_I2C_Read(uint16_t addr,uint8_t size)
- {
- while (HAL_I2C_Mem_Read(&hi2c1,0x00A0,addr,I2C_MEMADD_SIZE_16BIT,(uint8_t*)DS_Buff,size,10000) != HAL_OK)
- {
- if (HAL_I2C_GetError(&hi2c1) != HAL_I2C_ERROR_AF)
- {
- LCD_write_ASCII(0,3,1,(uint8_t *)"AT_Read_Error!");
- }
- }
- }
- /******************************************************************************************
- * 函数名称: AT24C32_I2C_Write(uint16_t addr,uint8_t size)
- * 功能说明: 写入数据到AT24C32(要写入的数据存放在DS_Buff数组中)
- * 输 入: adrr(起始地址),size(写入的字节长度)
- * 输 出: 无
- ******************************************************************************************/
- void AT24C32_I2C_Write(uint16_t addr,uint8_t size)
- {
- while (HAL_I2C_Mem_Write(&hi2c1,0x00A0,addr,I2C_MEMADD_SIZE_16BIT,(uint8_t*)DS_Buff,size,10000) != HAL_OK)
- {
- if (HAL_I2C_GetError(&hi2c1) != HAL_I2C_ERROR_AF)
- {
- LCD_write_ASCII(0,3,1,(uint8_t *)"AT_Write_Erro!");
- }
- }
- }
复制代码
|
|