1)實驗平臺:正點原子APM32E103最小系統(tǒng)板
2)平臺購買地址:https://detail.tmall.com/item.htm?id=609294757420
3)全套實驗源碼+手冊+視頻下載地址: http://www.openedv.com/docs/boards/xiaoxitongban
第四十章 IIC實驗
本章將介紹使用APM32E103驅(qū)動板載的EEPROM進行讀寫操作。通過本章的學(xué)習(xí),讀者將學(xué)習(xí)到使用GPIO模擬IIC時序以及EEPROM的驅(qū)動。
本章分為如下幾個小節(jié):
40.1 硬件設(shè)計
40.2 程序設(shè)計
40.3 下載驗證
40.1 硬件設(shè)計
40.1.1 例程功能
- 按下KEY_UP和KEY0按鍵,分別對24C02進行數(shù)據(jù)的寫入和讀取操作,讀取到的數(shù)據(jù)會顯示至LCD
- 可通過USMART對24C02進行讀寫一字節(jié)數(shù)據(jù)的操作
- LED0閃爍,指示程序正在運行
40.1.2 硬件資源 - LED
LED0 - PB5 - 按鍵
KEY0 - PE4
KEY_UP - PA0 - USART1(PA9、PA10連接至板載USB轉(zhuǎn)串口芯片上)
- 正點原子 2.8/3.5/4.3/7/10寸TFTLCD模塊(僅限MCU屏,16位8080并口驅(qū)動)
- 24C02
IIC_SCL - PB6
IIC_SDA - PB7
40.1.3 原理圖
本章實驗使用了板載的24C02芯片,該芯片是一個EEPROM,MCU是通過兩個GPIO與該EEPROM進行連接與通信的,該EEPROM與MCU的連接原理圖,如下圖所示:
圖40.1.3.1 EEPROM與MCU的連接原理圖
40.2 程序設(shè)計
40.2.1 Geehy標準庫的GPIO驅(qū)動
本章實驗通過控制與EEPROM連接的GPIO模擬IIC時序,實現(xiàn)EEPROM的讀寫操作,對于GPIO,主要涉及GPIO的配置和讀寫操作,需要一下幾個步驟:
①:配置GPIO引腳為通用輸出模式、開漏輸出和禁止上拉/下拉
②:在與EEPROM通信時,根據(jù)需求控制指定GPIO引腳輸出指定電平
③:在與EEPROM通信時,根據(jù)需求讀取指定GPIO引腳上的輸入電平
在Geehy標準庫中對應(yīng)的驅(qū)動函數(shù)如下:
①:配置GPIO引腳
請見第10.2.1小節(jié)中配置GPIO引腳的相關(guān)內(nèi)容。
②:設(shè)置GPIO引腳輸出電平
請見第10.2.1小節(jié)中設(shè)置GPIO引腳輸出電平的相關(guān)內(nèi)容。
③:讀取GPIO引腳輸入電平
請見第11.2.1小節(jié)中讀取GPIO引腳輸入電平的相關(guān)內(nèi)容。
40.2.2 IIC驅(qū)動
本章實驗使用的IIC的軟件模擬的IIC,即控制GPIO模擬IIC的時序與外部器件進行通信。IIC驅(qū)動主要負責(zé)向EEPROM驅(qū)動提供IIC操作的各種函數(shù),例如:IIC起始信號、IIC停止信號等。本章實驗中,IIC的驅(qū)動代碼包括myiic.c和myiic.h兩個文件。
IIC驅(qū)動中,對GPIO相關(guān)的宏定義,如下所示:
/* 引腳定義 */
#define IIC_SCL_GPIO_PORT GPIOB
#define IIC_SCL_GPIO_PIN GPIO_PIN_6
#define IIC_SCL_GPIO_CLK_ENABLE() do{ RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOB); }while(0)
#define IIC_SDA_GPIO_PORT GPIOB
#define IIC_SDA_GPIO_PIN GPIO_PIN_7
#define IIC_SDA_GPIO_CLK_ENABLE() do{ RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOB); }while(0)
/* IO操作 */
#define IIC_SCL(x) do{ x ? \
GPIO_SetBit(IIC_SCL_GPIO_PORT, IIC_SCL_GPIO_PIN) : \
GPIO_ResetBit(IIC_SCL_GPIO_PORT, IIC_SCL_GPIO_PIN); \
}while(0)
#define IIC_SDA(x) do{ x ? \
GPIO_SetBit(IIC_SDA_GPIO_PORT, IIC_SDA_GPIO_PIN) : \
GPIO_ResetBit(IIC_SDA_GPIO_PORT, IIC_SDA_GPIO_PIN); \
}while(0)
#define IIC_SDA_READ GPIO_ReadInputBit( IIC_SDA_GPIO_PORT, IIC_SDA_GPIO_PIN)
IIC驅(qū)動中,IIC的初始化函數(shù),如下所示:
/**
* @brief 初始化IIC
* @param 無
* @retval 無
*/
void iic_init(void)
{
GPIO_Config_T gpio_init_struct;
/* 使能時鐘 */
IIC_SCL_GPIO_CLK_ENABLE(); /* 使能IIC SCL引腳端口時鐘 */
IIC_SDA_GPIO_CLK_ENABLE(); /* 使能IIC SDA引腳端口時鐘 */
/* 配置IIC SCL引腳 */
gpio_init_struct.pin = IIC_SCL_GPIO_PIN; /* IIC SCL引腳 */
gpio_init_struct.speed = GPIO_SPEED_50MHz; /* 高速 */
gpio_init_struct.mode = GPIO_MODE_OUT_OD; /* 開漏輸出 */
GPIO_Config(IIC_SCL_GPIO_PORT, &gpio_init_struct);
/* 配置IIC SDA引腳 */
gpio_init_struct.pin = IIC_SDA_GPIO_PIN; /* IIC SDA引腳 */
gpio_init_struct.speed = GPIO_SPEED_50MHz; /* 高速 */
gpio_init_struct.mode = GPIO_MODE_OUT_OD; /* 開漏輸出 */
GPIO_Config(IIC_SDA_GPIO_PORT, &gpio_init_struct);
iic_stop(); /* 停止IIC總線上所有設(shè)備 */
}
可以看到,IIC的初始化實際上就是配置IIC時鐘與數(shù)據(jù)信號對應(yīng)的GPIO引腳。
IIC驅(qū)動中對IIC的各種操作,例如產(chǎn)生IIC起始信號、產(chǎn)生IIC停止信號等,請讀者結(jié)合IIC的時序規(guī)定查看本實驗的配套實驗源碼。
40.2.3 EEPROM驅(qū)動
本章實驗的EEPROM驅(qū)動主要負責(zé)向應(yīng)用層提供EEPROM的初始化和讀寫數(shù)據(jù)等操作函數(shù)。本章實驗中,EEPROM的驅(qū)動代碼包括24cxx.c和24cxx.h兩個文件。
EEPROM驅(qū)動中,EEPROM的初始化函數(shù),如下所示:
/**
* @brief 初始化AT24CXX
* @param 無
* @retval 無
*/
void at24cxx_init(void)
{
iic_init();
}
可以看到,該函數(shù)實際上就是初始化了與EEPROM通訊的IIC。
EEPROM驅(qū)動中的其他對EEPROM的操作函數(shù),例如:EEPROM的讀寫函數(shù),請讀者結(jié)合24C02 EEPROM芯片的數(shù)據(jù)手冊查看本實驗的配套實驗源碼。
40.2.4 實驗應(yīng)用代碼
本章實驗的應(yīng)用代碼,如下所示:
/* 待寫入24C02的數(shù)據(jù) */文章來源:http://www.zghlxwxcb.cn/news/detail-834053.html
static const uint8_t g_text_buf[] = {"APM32 IIC TEST"};
/* 待寫入24C02數(shù)據(jù)的長度 */
#define TEXT_SIZE sizeof(g_text_buf)
int main(void)
{
uint8_t t = 0;
uint8_t key;
uint8_t data[TEXT_SIZE];
NVIC_ConfigPriorityGroup(NVIC_PRIORITY_GROUP_4); /* 設(shè)置中斷優(yōu)先級分組為組4 */
sys_apm32_clock_init(15); /* 配置系統(tǒng)時鐘 */
delay_init(120); /* 初始化延時功能 */
usart_init(115200); /* 初始化串口 */
usmart_dev.init(120); /* 初始化USMART */
led_init(); /* 初始化LED */
lcd_init(); /* 初始化LCD */
key_init(); /* 初始化按鍵 */
at24cxx_init(); /* 初始化AT24CXX */
lcd_show_string(30, 50, 200, 16, 16, "APM32", RED);
lcd_show_string(30, 70, 200, 16, 16, "IIC TEST", RED);
lcd_show_string(30, 90, 200, 16, 16, "ATOM@ALIENTEK", RED);
lcd_show_string(30, 110, 200, 16, 16, "KEY_UP:Write KEY0:Read", RED);
while (at24cxx_check() != 0) /* 檢測不到24C02 */
{
lcd_show_string(30, 130, 200, 16, 16, "24C02 Check Failed!", RED);
delay_ms(500);
lcd_show_string(30, 130, 200, 16, 16, "Please Check! ", RED);
delay_ms(500);
LED0_TOGGLE();
}
/* 24C02檢測正常 */
lcd_show_string(30, 130, 200, 16, 16, "24C02 Ready! ", RED);
while (1)
{
t++;
key = key_scan(0);
if (key == WKUP_PRES) /* 寫入數(shù)據(jù) */
{
lcd_fill(0, 150, 239, 319, WHITE);
lcd_show_string( 30, 150, 200, 16, 16,
"Start Write 24C02....",
BLUE);
at24cxx_write(0, (uint8_t *)g_text_buf, TEXT_SIZE);
lcd_show_string( 30, 150, 200, 16, 16,
"24C02 Write Finished!",
BLUE);
}
else if (key == KEY0_PRES) /* 讀取數(shù)據(jù) */
{
lcd_show_string( 30, 150, 200, 16, 16,
"Start Read 24C02.... ",
BLUE);
at24cxx_read(0, data, TEXT_SIZE);
lcd_show_string(30, 150, 200, 16, 16,
"The Data Readed Is: ",
BLUE);
lcd_show_string(30, 170, 200, 16, 16, (char *)data, BLUE);
}
if (t == 20)
{
LED0_TOGGLE();
t = 0;
}
delay_ms(10);
}
}
從本章實驗的應(yīng)用代碼中可以看到,在初始化完EEPROM后,會檢測與EEPROM的連接是否正常,若與EEPROM的連接正常,則會不斷地等待按鍵輸入,若檢測到KEY_UP按鍵被按下,則會往EEPROM的指定地址中寫入指定的數(shù)據(jù),若檢測到KEY_0按鍵被按下,則會從EEPROM的指定地址中讀取數(shù)據(jù),并在LCD上進行顯示。
40.3 下載驗證
在完成編譯和燒錄操作后,若MCU與EEPROM的連接無誤,則可以在LCD上看到“24C02 Ready!”的提示信息,此時可以按下KEY_UP按鍵往EEPROM的指定地址寫入指定數(shù)據(jù),然后再按下KEY_0按鍵從EEPROM的指定地址將寫入的數(shù)據(jù)讀回來在LCD上進行顯示,此時便可以看到在LCD上顯示了“APM32 IIC TEST”的提示信息,該提示信息就是從EEPROM中讀回的數(shù)據(jù)。文章來源地址http://www.zghlxwxcb.cn/news/detail-834053.html
到了這里,關(guān)于【正點原子STM32連載】 第四十章 IIC實驗 摘自【正點原子】APM32E103最小系統(tǒng)板使用指南的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!