void eeprom_buffer_write(uint8_t* p_buffer, uint8_t write_address, uint16_t number_of_byte) { uint8_t number_of_page = 0, number_of_single = 0, address = 0, count = 0; address = write_address % I2C_PAGE_SIZE; count = I2C_PAGE_SIZE - address; number_of_page = number_of_byte / I2C_PAGE_SIZE; number_of_single = number_of_byte % I2C_PAGE_SIZE; //write_address相对于当前页的偏移量 //count表示该页中还剩余多少可写的空间 //number_of_page表示要写入的整个页数(即不包括最后一页) //number_of_single表示要写入的最后一页的字节数 if(0 == address){ while(number_of_page--){ eeprom_page_write(p_buffer, write_address, I2C_PAGE_SIZE); eeprom_wait_standby_state(); write_address += I2C_PAGE_SIZE; p_buffer += I2C_PAGE_SIZE; } if(0 != number_of_single){ eeprom_page_write(p_buffer, write_address, number_of_single); eeprom_wait_standby_state(); } }else{ /* if write_address is not I2C_PAGE_SIZE aligned / // if(number_of_byte < count){ eeprom_page_write(p_buffer, write_address, number_of_byte); eeprom_wait_standby_state(); }else{ number_of_byte -= count; number_of_page = number_of_byte / I2C_PAGE_SIZE; number_of_single = number_of_byte % I2C_PAGE_SIZE; if(0 != count){ eeprom_page_write(p_buffer, write_address, count); eeprom_wait_standby_state(); write_address += count; p_buffer += count; } / write page / while(number_of_page--){ eeprom_page_write(p_buffer, write_address, I2C_PAGE_SIZE); eeprom_wait_standby_state(); write_address += I2C_PAGE_SIZE; p_buffer += I2C_PAGE_SIZE; } / write single */ if(0 != number_of_single){ eeprom_page_write(p_buffer, write_address, number_of_single); eeprom_wait_standby_state(); } } } }详细解释这段的代码的每一个语句
时间: 2023-12-15 22:05:06 浏览: 83
code uint8-t *p-flash 与uint8-t code *p-flash的区别
这段代码是用于在EEPROM中写入数据的函数。下面对每个语句进行详细解释:
1. uint8_t number_of_page = 0, number_of_single = 0, address = 0, count = 0;
定义4个变量,分别为要写入的整页数、最后一页的字节数、写入地址的偏移量和当前页可写入的字节数。
2. address = write_address % I2C_PAGE_SIZE;
求出写入地址相对于当前页的偏移量。
3. count = I2C_PAGE_SIZE - address;
计算当前页中还剩余多少可写的空间。
4. number_of_page = number_of_byte / I2C_PAGE_SIZE;
计算要写入的整个页数(即不包括最后一页)。
5. number_of_single = number_of_byte % I2C_PAGE_SIZE;
计算要写入的最后一页的字节数。
6. if(0 == address){
如果写入地址已经对齐到一页的起始地址,执行以下的循环。
7. while(number_of_page--){
循环写入整页数据。
8. eeprom_page_write(p_buffer, write_address, I2C_PAGE_SIZE);
写入一个整页的数据到EEPROM中。
9. eeprom_wait_standby_state();
等待EEPROM进入就绪状态。
10. write_address += I2C_PAGE_SIZE;
将写入地址指向下一页的起始地址。
11. p_buffer += I2C_PAGE_SIZE;
将数据指针移动到下一页的起始地址。
12. if(0 != number_of_single){
如果还有剩余的字节需要写入,执行以下代码。
13. eeprom_page_write(p_buffer, write_address, number_of_single);
写入最后一页的数据到EEPROM中。
14. eeprom_wait_standby_state();
等待EEPROM进入就绪状态。
15. }else{
如果没有剩余的字节需要写入,直接结束函数。
16. }else{
如果写入地址没有对齐到一页的起始地址,执行以下代码。
17. if(number_of_byte < count){
如果要写入的字节数小于当前页可写的字节数,执行以下代码。
18. eeprom_page_write(p_buffer, write_address, number_of_byte);
直接写入所有字节到当前页中。
19. eeprom_wait_standby_state();
等待EEPROM进入就绪状态。
20. }else{
如果要写入的字节数大于当前页可写的字节数,执行以下代码。
21. number_of_byte -= count;
将当前页可写的字节数从要写入的字节数中减去。
22. number_of_page = number_of_byte / I2C_PAGE_SIZE;
计算要写入的整个页数(即不包括最后一页)。
23. number_of_single = number_of_byte % I2C_PAGE_SIZE;
计算要写入的最后一页的字节数。
24. if(0 != count){
如果当前页还有剩余的空间可写,执行以下代码。
25. eeprom_page_write(p_buffer, write_address, count);
将当前页剩余的空间全部写入。
26. eeprom_wait_standby_state();
等待EEPROM进入就绪状态。
27. write_address += count;
将写入地址指向下一页的起始地址。
28. p_buffer += count;
将数据指针移动到下一页的起始地址。
29. }
30. while(number_of_page--){
循环写入整页数据。
31. eeprom_page_write(p_buffer, write_address, I2C_PAGE_SIZE);
写入一个整页的数据到EEPROM中。
32. eeprom_wait_standby_state();
等待EEPROM进入就绪状态。
33. write_address += I2C_PAGE_SIZE;
将写入地址指向下一页的起始地址。
34. p_buffer += I2C_PAGE_SIZE;
将数据指针移动到下一页的起始地址。
35. }
36. if(0 != number_of_single){
如果还有剩余的字节需要写入,执行以下代码。
37. eeprom_page_write(p_buffer, write_address, number_of_single);
写入最后一页的数据到EEPROM中。
38. eeprom_wait_standby_state();
等待EEPROM进入就绪状态。
39. }
}
阅读全文