日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

STM32設(shè)置為I2C從機(jī)

單片機(jī)
2018-06-22 17:40
關(guān)鍵字: i2c
收藏

硬件平臺(tái):STM32F401

編輯器 : keil 5.18

操作系統(tǒng):win7


一、I2C協(xié)議

在傳輸數(shù)據(jù)的時(shí)候,SDA線必須在時(shí)鐘的高電平周期保持穩(wěn)定,SDA的高或低電平狀態(tài)只有在SCL 線的時(shí)鐘信號(hào)是低電平時(shí)才能改變 。


起始和停止條件

  SCL 線是高電平時(shí),SDA 線從高電平向低電平切換,這個(gè)情況表示起始條件;

  SCL 線是高電平時(shí),SDA 線由低電平向高電平切換,這個(gè)情況表示停止條件。


尋址方式(7/10位地址方式)


  第一個(gè)字節(jié)的頭7 位組成了從機(jī)地址,最低位(LSB)是第8 位,它決定了傳輸?shù)?普通的和帶重復(fù)開(kāi)始條件的7位地址格式方向。第一個(gè)字節(jié)的最低位是“0”,表示主機(jī)會(huì)寫信息到被選中的從機(jī);“1”表示主機(jī)會(huì)向從機(jī)讀信息。當(dāng)發(fā)送了一個(gè)地址后,系統(tǒng)中的每個(gè)器件都在起始條件后將頭7 位與它自己的地址比較,如果一樣,器件會(huì)判定它被主機(jī)尋址,至于是從機(jī)接收器還是從機(jī)發(fā)送器,都由R/W 位決定。


二、I2C從機(jī)模式

1、設(shè)置i2c從地址


I2C_HandleTypeDef I2cHandle;


I2cHandle.Instance = I2C1;

I2cHandle.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;

I2cHandle.Init.ClockSpeed = 400000;

I2cHandle.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;

I2cHandle.Init.DutyCycle = I2C_DUTYCYCLE_16_9;

I2cHandle.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;

I2cHandle.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;

I2cHandle.Init.OwnAddress1 = I2C_ADDRESS;

I2cHandle.Init.OwnAddress2 = 0xFE;


其中如前面介紹,I2C有兩種地址方式,在這里I2C_ADDRESSINGMODE_7BIT是將I2C設(shè)置為7為從機(jī)地址模式。OwnAddress1為本設(shè)備I2C地址即我們自己設(shè)置的從機(jī)地址,OwnAddress2不需要設(shè)置。

2、I2C引腳與中斷初始化


void HAL_I2C_MspInit(I2C_HandleTypeDef *hi2c)

{

GPIO_InitTypeDef GPIO_InitStruct;


/* Enable GPIO TX/RX clock */

I2Cx_SCL_GPIO_CLK_ENABLE();

I2Cx_SDA_GPIO_CLK_ENABLE();

/* Enable I2C1 clock */

I2Cx_CLK_ENABLE();


/* Configure peripheral GPIO */

/* I2C TX GPIO pin configuration */

GPIO_InitStruct.Pin = I2Cx_SCL_PIN;

GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;

GPIO_InitStruct.Pull = GPIO_PULLUP;

GPIO_InitStruct.Speed = GPIO_SPEED_FAST;

GPIO_InitStruct.Alternate = I2Cx_SCL_AF;


HAL_GPIO_Init(I2Cx_SCL_GPIO_PORT, &GPIO_InitStruct);


/* I2C RX GPIO pin configuration */

GPIO_InitStruct.Pin = I2Cx_SDA_PIN;

GPIO_InitStruct.Alternate = I2Cx_SDA_AF;


HAL_GPIO_Init(I2Cx_SDA_GPIO_PORT, &GPIO_InitStruct);


/* Configure the NVIC for I2C */

/* NVIC for I2C1 */

HAL_NVIC_SetPriority(I2Cx_ER_IRQn, 0, 2);

HAL_NVIC_EnableIRQ(I2Cx_ER_IRQn);

HAL_NVIC_SetPriority(I2Cx_EV_IRQn, 0, 1);

HAL_NVIC_EnableIRQ(I2Cx_EV_IRQn);

}


三、從發(fā)送


uint8_t aTxBuffer[] = "....hello world....";


while (1)

{

if(HAL_I2C_Slave_Transmit_IT(&I2cHandle, (uint8_t*)aTxBuffer, TXBUFFERSIZE+1)!= HAL_OK)

{

/* Transfer error in transmission process */

Error_Handler();

}

HAL_Delay(100);


while (HAL_I2C_GetState(&I2cHandle) != HAL_I2C_STATE_READY)

{

Error_Handler();

}

}


到這里就大功告成了。


相關(guān)推薦