前言
之前使用的pca9535由于芯片本身有些中斷問題和采購問題,目前換成了pca9555的IO擴展芯片來使用,本文章適用于這兩款芯片。
一、開發(fā)環(huán)境
編譯器: keil5
工程庫: HAL庫
芯片型號:STM32F072
二、開發(fā)流程
開發(fā)手冊解析及使用
pca9535和pca9555基本一樣,這里我就主要說9535的手冊了。
手冊下載地址網(wǎng)上有很多,直接去百度搜索就行了。
1、芯片I2C地址如何確定
如圖,A2、A1、A0和其他5位共同決定了I2C的地址,其中A2、A1、A0一般硬件直接接地,在配置地址的時候需要確認這3位的狀態(tài)。我這里這3位是0。所以I2C地址是0x40。
1、芯片寄存器地址
命令字節(jié)要在寫入的時候跟隨地址字節(jié)的第一個字節(jié)一起傳到芯片內(nèi),分別是:
輸入端口 0 → 0
輸入端口 1 → 1
輸出端口 0 → 2
輸出端口 1 → 3
極性反轉(zhuǎn)端口 0 → 4
極性反轉(zhuǎn)端口 1 → 5
配置端口 0 → 6
配置端口 1 → 7
每個端口對應的命令字節(jié)不同,可以根據(jù)自己的需求去配置這些端口,我這里就簡單的配置IO為輸入輸出模式。
上圖說明要配置成輸出模式需要將配置寄存器(6和7寄存器)的相應位置成0,要配置成輸入模式要將相應位置1。
// PCA9535命令宏
#define PCA9535_INPUT_PORT0_REG 0
#define PCA9535_INPUT_PORT1_REG 1
#define PCA9535_OUTPUT_PORT0_REG 2
#define PCA9535_OUTPUT_PORT1_REG 3
#define PCA9535_INVERSION_PORT0_REG 4
#define PCA9535_INVERSION_PORT1_REG 5
#define PCA9535_CONFIG_PORT0_REG 6
#define PCA9535_CONFIG_PORT1_REG 7
#define PCA9535_CONFIG_VAL0 0xE0
#define PCA9535_CONFIG_VAL1 0xFB
uint8_t Pca9535_Init(void)
{
uint8_t w_data[] = {0x00, 0x00, 0x00};
uint8_t r_data[] = {0x00, 0x00};
// 上電先讀取一次清除中斷標志
memset(w_data, 0, sizeof(w_data));
pca9535_read(PCA9535_INPUT_PORT0_REG, r_data, 2);
// 配置PCA9535 端口,即寫配置寄存器,數(shù)據(jù)格式為:地址 + CMD + 8 input + 8 output
w_data[0] = PCA9535_CONFIG_PORT0_REG; //config_port0 寄存器
w_data[1] = PCA9535_CONFIG_VAL0;
w_data[2] = PCA9535_CONFIG_VAL1;
if (HAL_OK != pca9535_write(w_data, sizeof(w_data)))
{
pca9535_write(w_data, sizeof(w_data));
pr_debug(0x03,"pca9535_write error\n");
return 0;
}
return 1;
}
IO口模式配置成功后需要進行輸入的讀取和輸出的設置。
tips:在進行初始化前,一定要先讀取一遍寄存器再進行寫寄存器。原因是需要先清除中斷。
如上我就是把P07,P06,P05配置成了輸入模式,P04,P03,P02,P01,P00配置成了輸出模式;把P1中除了P12配置成了輸出其余都配置成了輸入模式。
IO輸出設置:
uint8_t io_out(void)
{
uint8_t data[] = {0x00, 0x00};
data[0] = PCA9535_OUTPUT_PORT0_REG;
data[1] = 0xfe;
if (HAL_OK != pca9535_write(led_data, sizeof(led_data)))
{
printf("pca9535 write error\n");
return 0;
}
return 1;
}
如上則是把P00設置成了低電平,其余都是P0口都是高電平。
進行寫寄存器的時候直接寫即可:
HAL_StatusTypeDef pca9535_write(uint8_t *pData, uint16_t size)
{
return (HAL_I2C_Master_Transmit(&hi2c1, PCA9535_ADDR, pData, size, 1000));
}
在進行讀寄存器的時候需要看一下官方的iic時序,他是發(fā)了command + data0 +data1后再發(fā)送的stop命令。
我這里調(diào)用的hal庫進行讀寄存器,則需要改一下官方的 HAL_I2C_Master_Receive 函數(shù)后才能調(diào)用。
pca9535_read()讀取的代碼比較多,我這里就不上傳了。需要的私信我即可。文章來源:http://www.zghlxwxcb.cn/news/detail-671923.html
總結(jié)
pca9535這款芯片里面還是有些小坑的,在進行stm32開發(fā)時要注意中斷問題,和iic讀取問題,如若用成中斷觸發(fā),還需要添加以下錯誤機制,在我使用的時候還是發(fā)生過偶爾芯片初始化不正確,或者使用中讀寄存器值不對的狀態(tài)。文章來源地址http://www.zghlxwxcb.cn/news/detail-671923.html
到了這里,關于基于STM32的pca9535、pca9555IO擴展板開發(fā)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!