СОВРЕМЕННАЯ ЭЛЕКТРОНИКА №1/2015
ЭЛЕМЕНТЫ И КОМПОНЕНТЫ 42 WWW.SOEL.RU СОВРЕМЕННАЯ ЭЛЕКТРОНИКА ◆ № 1 2015 Листинг 2 void I2C_StartTransmission(I2C_TypeDef* I2Cx, uint8_t transmissionDirection, uint8_t slaveAddress) { // Ждать освобождения шины while(I2C_GetFlagStatus(I2Cx, I2C_FLAG_BUSY)); // Сформировать старт-условие I2C_GenerateSTART(I2Cx, ENABLE); // Ждать установки бита while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT)); // Отправить адрес ведомому устройству I2C_Send7bitAddress(I2Cx, slaveAddress, transmissionDirection); // Если передача данных if(transmissionDirection== I2C_Direction_Transmitter) {while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));} // Если прием данных if(transmissionDirection== I2C_Direction_Receiver) {while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));} } Листинг 3 // Функция передачи данных void I2C_WriteData(I2C_TypeDef* I2Cx, uint8_t data) { // Вызвать библиотечную функцию передачи данных I2C_SendData(I2Cx, data); // Ждать окончания передачи данных while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); } // Функция приема данных uint8_t I2C_ReadData(I2C_TypeDef* I2Cx) { // Ждать поступления данных while( !I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_RECEIVED) ); data = I2C_ReceiveData(I2Cx); // Считать данные из регистра return data; // Возвратить данные в вызывающую функцию } ● разряд 7 DUALF – является флагом двойной адресации в режиме ведо- мого; ● разряд 6 SMBHOST – устанавливается, когда принят заголовок SMBus Host в режиме ведомого; ● разряд 5 SMBDEFAULT – возника- ет, если принят адрес по умолча- нию для SMBus-устройства в режи- ме ведомого; ● разряд 4 GENCALL – указывает, что принят адрес общего вызова в режи- ме ведомого; ● разряд 3 – зарезервирован; ● разряд 2 TRA – оповещает о режиме передачи/приёма; ● разряд 1 BUSY – информирует, что шина занята; ● разряд 0 MSL – детектирует режим «Ведущий»/«Ведомый». Регистр I 2 C_CCR – регистр управле- ния тактовым сигналом, который вклю- чает в себя разряды: ● разряд 15 F/S – задаёт стандартную или быструю скорость для режима ведущего; ● разряд 14 DUTY – назначает скваж- ность 2 или 16/9 в быстром ре- жиме; ● разряды 13 и 12 – зарезервированы; ● разряды 11…0 CCR[11:0] – управля- ют тактовым сигналом для быстрой и стандартной скорости в режиме ведущего. Регистр I 2 C_TRISE – регистр па- раметра TRISE, который включает в себя: ● разряды 15…6 – зарезервированы; ● разряды 5…0 TRISE[5:0] – определя- ют максимальное время фронта для быстрой и стандартной скорости в режиме ведущего. Данный пара- метр задаёт момент времени, по кото- рому производятся выборка состоя- ния линий. Более подробное описание наз- начения всех регистров I 2 C и их разрядов можно найти на сайте www.st.com [2]. П РОГРАММИРОВАНИЕ ИНТЕРФЕЙСА I 2 С Рассмотрим практическую реа- лизацию по использованию интер- фейса I 2 С. Для этого можно восполь- зоваться стандартной библиоте- кой периферии микроконтролле- ра STM32. Для интерфейса I 2 C наст- ройки режима, скорости и всего остального находятся в заголовоч- ном файле и объявлены в виде струк- туры: Листинг 1 GPIO_InitTypeDef gpio; // Создание структуры для портов ввода-вывода I2C_InitTypeDef i2c; // Создание структуры для интерфейса I2C void init_I2C1(void) { // Включить тактирование RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); // Инициализировать I2C i2c.I2C_ClockSpeed = 100000; i2c.I2C_Mode = I2C_Mode_I2C; i2c.I2C_DutyCycle = I2C_DutyCycle_2; // Задать адрес=0x12 i2c.I2C_OwnAddress1 = 0x12; i2c.I2C_Ack = I2C_Ack_Disable; i2c.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; I2C_Init(I2C1, &i2c); // Назначить выводы интерфейса gpio.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
RkJQdWJsaXNoZXIy MTQ4NjUy