# 1 前言
本章介绍下使用芯昇的eeprom保存wifi账户和密码。
测试功能块:I2C
# 2 硬件
如图,eeprom使用的是PC0和PC1。
# 3 打开示例
File -- New -- Project -- Next -- 选start下的
# 代码
建议查看下readme.txt
- #include "nuclei_sdk_soc.h"
- #include "i2c_eeprom.h"
- #include "bsp.h"
- #include "main.h"
- // add .h
- #include "string.h"
- #include "stdlib.h"
- uint8_t tx_buf[TEST_EEPROM_SIZE] = {0};
- uint8_t rx_buf[TEST_EEPROM_SIZE] = {0};
- volatile Status test_status = FAILED;
- #define HEAD_ID "ID:"
- #define HEAD_PW "PW:"
- #define END_EOF "EOF"
- #define WIFI_ID "wifi_name"
- #define WIFI_PW "123456"
- Status Buffercmp(uint8_t* pBuffer1, uint8_t* pBuffer2, uint16_t BufferLength);
- void get_id();
- void get_pw();
- int main(void)
- {
- uint16_t i = 0;
- log_init();
- log_info("this is a I2C EEPROM demorn");
- /* Initialize the I2C EEPROM driver ----------------------------------------*/
- I2C_EE_Init();
- /* Fill the buffer to send */
- for (i = 0; i < TEST_EEPROM_SIZE; i++)
- {
- tx_buf[i] = 0;
- // log_info("tx_buf[%d]= %dn",i,tx_buf[i]);
- }
- log_info("Write to I2C EEPROMrn");
- /* First write in the memory followed by a read of the written data --------*/
- /* Write to I2C EEPROM from TEST_EEPROM_ADDR */
- // I2C_EE_WriteBuffer(tx_buf, TEST_EEPROM_ADDR, TEST_EEPROM_SIZE);
- e2_set_wifi(WIFI_ID,WIFI_PW);
- log_info("nRead from I2C EEPROMrn");
- /* Read from I2C EEPROM from sEE_READ_ADDRESS1 */
- I2C_EE_ReadBuffer(rx_buf, TEST_EEPROM_ADDR, TEST_EEPROM_SIZE);
- // print rx value ---- eeprom value
- // print_eeprom();
- get_id();
-
- while (1)
- {
- }
- }
- void get_id()
- {
- char * temp_id_start;
- char * temp_id_eof;
- temp_id_start = strstr(rx_buf,HEAD_ID);
- if(temp_id_start == NULL)
- log_info("not find idn");
- else
- {
- // printf("find id = %sn",temp_id_start+strlen(HEAD_ID));
- temp_id_eof = strstr(rx_buf,END_EOF);
- if(temp_id_eof == NULL)
- log_info("not find pw eofn");
- else
- {
- temp_id_start = temp_id_start + strlen(HEAD_ID);
- int len_id = temp_id_eof - temp_id_start ;
- printf("nfind id len = %dn",len_id);
- char * temp_id_value = (char *) malloc(len_id +1);
- memset(temp_id_value,0x00,len_id+1);
- strncpy(temp_id_value,temp_id_start ,len_id);
- printf("find id = %sn",temp_id_value);
- // get pw
- get_pw(temp_id_eof + strlen(END_EOF));
- free(temp_id_value);
- }
- }
- return;
- }
- void get_pw(char * str)
- {
- char * temp_pw_start;
- char * temp_pw_eof;
- temp_pw_start = strstr(str,HEAD_PW);
- if(temp_pw_start == NULL)
- log_info("not find pwn");
- else
- {
- // printf("find pw = %sn",temp_pw_start+strlen(HEAD_PW));
- temp_pw_eof = strstr(str,END_EOF);
- if(temp_pw_eof == NULL)
- log_info("not find pw eofn");
- else
- {
- temp_pw_start = temp_pw_start + strlen(HEAD_PW);
- int len_pw = temp_pw_eof - temp_pw_start ;
- printf("find pw len = %dn",len_pw);
- char * temp_pw_value = (char *) malloc(len_pw +1);
- memset(temp_pw_value,0x00,len_pw+1);
- strncpy(temp_pw_value,temp_pw_start ,len_pw);
- printf("find pw = %sn",temp_pw_value);
- free(temp_pw_value);
- }
- }
- return;
- }
- void print_eeprom()
- {
- for (int i = 0; i < TEST_EEPROM_SIZE; i++)
- {
- log_info("tx_buf[%d]= %02xn",i,rx_buf[i]);
- }
- log_info("n");
- }
- void e2_set_wifi(char* id, char* pw)
- {
- char* char_id_pw;
- int len_id = strlen(id);
- int len_pw = strlen(pw);
- int len_all = len_id + len_pw + strlen(HEAD_ID) + strlen(HEAD_PW) + 2*strlen(END_EOF)+1;
- log_info("len_id = %dn",len_all);
- char_id_pw =(char*)malloc(len_all);
- memset(char_id_pw,0x00,len_all);
- strcat(char_id_pw,HEAD_ID);
- strcat(char_id_pw,id);
- strcat(char_id_pw,END_EOF);
- strcat(char_id_pw,HEAD_PW);
- strcat(char_id_pw,pw);
- strcat(char_id_pw,END_EOF);
- log_info("char_id_pw = %sn",char_id_pw);
- I2C_EE_WriteBuffer(char_id_pw, TEST_EEPROM_ADDR, len_all);
- free(char_id_pw);
- return;
- }
- Status Buffercmp(uint8_t* pBuffer, uint8_t* pBuffer1, uint16_t BufferLength)
- {
- while (BufferLength--)
- {
- if (*pBuffer != *pBuffer1)
- {
- return FAILED;
- }
- pBuffer++;
- pBuffer1++;
- }
- return PASSED;
- }
复制代码
readme.txt介绍项目
- 1、功能说明
- 此例程展示了通过I2C模块与外部EEPRON的通信,分别采用查询、中断、DMA方式进行EEPROM的读写。
- 2、使用环境
- /* 软件开发环境:当前工程使用的软件工具名称及版本号 */
- IDE工具:NucleiStudio IDE for C/C++ 2022-01
-
- /* 开发板 */
- CM32M433R-START
- 3、使用说明
-
- 1、时钟源:HSE+PLL
- 2、主时钟:144MHz
- 3、I2C3 配置:
- SCL --> PC0
- SDA --> PC1
- ADDR:0xA0(7bit)
- CLOCK:400KHz
-
- 4、USART1配置:
- TX --> PD0
- 波特率:115200
- 数据位:8bit
- 停止位:1bit
- 无校验
- 5、测试步骤与现象
- a,将六类接口功能扩展板和CM32M433R-START进行连接
- b,编译下载代码复位运行
- c,从串口看打印信息,验证结果
- d,修改i2c_eeprom.h中的PROCESS_MODE宏值,0代表查询方式进行I2C通信,1代表中断方式进行I2C通信,2代表DMA方式进行I2C通信。
- e,重新编译下载代码,复位运行查看结果。
- 4、注意事项
- 1,此处使用的EEPROM是AT24C02,32个page,每个page 8byte
- 2,读写数据时若长度大于一个page,则器件地址会自动回卷
- 3,SCL,SDA有1K的外部上拉电阻
-
复制代码
# log
如图,先打印存储的wifi信息,然后再取出eeprom的数据,从中分离出来wifi信息。
至此成功将wifi账户和密码存入eeprom。
可以测试将e2_set_wifi注销掉,然后打开print_eeprom(),验证下掉电是否保留。
# 小结
本开发板不具备wifi和bt功能,但是由于它的uart,i2c等接口较多,适合做中控或者uart模拟器,用于和多个设备进行通信。
后续再测试uart功能。
|