当前位置:网站首页>Processus d'analyse et de configuration du matériel IIC pour le développement de la machine nue imx6ull
Processus d'analyse et de configuration du matériel IIC pour le développement de la machine nue imx6ull
2022-04-23 00:54:00 【Swiler】
Matériel de configuration en métal nuI2C
À propos deI2CDescription détaillée de,Voir mon autre article
IMX6UMatérielI2CCaractéristiques
- Normes de compatibilitéI2CBus;
- Logiciel configurable64Différentes fréquences d'horloge série;
- Signal de réponse optionnel du logiciel;
- start/endGénération et détection de signaux;
- Je répète.startGénération de signaux;
- Confirmer la génération de bits;
- BusbusyDétection.
I2CDeux modes de
- Mode standard:Dans ce modeI2CTaux de transmission jusqu'à100kb/s;
- Mode haute vitesse:Dans ce modeI2CTaux de transmission jusqu'à400kb/s;
Broche externeMAP
IMX6UOui.4GroupeIIC,Voici un exemple,Autre référence《IMX6UManuel de référence》P1244

Horloge
IIC Il y a deux sources d'horloge pour :
( Une horloge modulaire pour les opérations de lecture et d'écriture ,L'un estI2C Horloge fonctionnelle pour . La fréquence d'horloge du BIT série provient de l'horloge du module . L'horloge modulaire et l'horloge périphérique sont synchronisées les unes avec les autres . La fréquence minimale de l'horloge du module doit être de 12.8MHz,Pour atteindre400kbpsFonctionnement.)

MatérielI2C Vue d'ensemble
De haut en bas de l'adresse /Bloc de données,5Registres, Composition du bloc d'horloge .Comme ça.block,IMX6UIl y en a quatre..

Introduction au Registre
Par groupeIICCorrespondant à5Registres,La figure ci - dessous montreIIC1Groupe de registre pour

I2Cx_IFDRRegistres
Ce registre est utilisé pour configurerIICL'horloge de, Mais ne peut pas être configuré à volonté , Mais il y a des valeurs fixes . Ce registre n'est que bas 6Bit valide.

I2Cx_I2CRRegistres

IEN:I2C Activer le BIT,1Activer,0Fermer
IIEN:I2C Interrompre le BIT d'activation,1Activer,0Fermer
MSTA: Mode maître - esclave sélectionner les bits ,1Mode principal,0Du mode
MTX:Bit de sélection de la direction de transmission,1Réception,0Envoyer
TXAK: Transmission du BIT de réponse activé ,1 Envoyer un signal de non - réponse NACK,0Envoyer un signal de réponseACK
RSTA: Répétez le signal de départ ,1Envoyer unrestartSignal
I2Cx_I2SRRegistres

ICF: Bit d'état de transfert de données ,0Transmission terminée,1 Transfert en cours
IAAS:Pour1Ça veut direIICAdresse
IBB:BusBUSYBits,0Inactif,1Occupé.
IAL: Arbitrage bit manquant ,Pour1 L'arbitrage est perdu
SRW: Lire et écrire les bits d'état de la machine (IIC Utilisé comme esclave )
IIF: Interrompre le BIT de drapeau suspendu , Pour effacer le logiciel .
RXAK: Signal de réponse bit
Analyse des codes
IICInitialisation
void i2c_io_init(void)
{
//ConfigurationI2C1 Pins associés à
IOMUXC_SetPinMux(IOMUXC_UART4_TX_DATA_I2C1_SCL, 1);
IOMUXC_SetPinMux(IOMUXC_UART4_RX_DATA_I2C1_SDA, 1);
IOMUXC_SetPinConfig(IOMUXC_UART4_TX_DATA_I2C1_SCL, 0x70B0);
IOMUXC_SetPinConfig(IOMUXC_UART4_RX_DATA_I2C1_SDA, 0X70B0);
}
void i2c_init(I2C_Type *base)
{
base->I2CR &= ~(1 << 7); /* À visiterI2CRegistre, Il faut d'abord fermer I2C */
base->IFDR = 0X15 << 0; /* Configurer le facteur de division de fréquence ,Pour définirI2CTaux de Baud100K */
base->I2CR |= (1<<7); /* ActiverIICMatériel */
}
ConfigurationIICDestartSignal
unsigned char i2c_start(I2C_Type *base, unsigned char address, enum i2c_direction direction)
{
if(base->I2SR & (1 << 5)) /* DétectionI2C Occupé ou pas */
return 1;
base->I2CR |= (1 << 5) | (1 << 4); /* ConfigurationIICMode Maître, La direction de transmission des données est la transmission des données */
/* Définir l'adresse esclave */
base->I2DR = ((unsigned int)address << 1) | ((direction == kI2C_Read)? 1 : 0);
return 0;
}
ConfigurationIICDerestartSignal
unsigned char i2c_repeated_start(I2C_Type *base, unsigned char address, enum i2c_direction direction)
{
base->I2CR |= (1 << 4) | (1 << 2); /* ConfigurationIIC Pour envoyer la direction des données et générer un restartSignal */
/* Définir l'adresse esclave */
base->I2DR = ((unsigned int)address << 1) | ((direction == kI2C_Read)? 1 : 0);
return 0;
}
ConfigurationIIC Signal d'arrêt de
unsigned char i2c_master_stop(I2C_Type *base)
{
unsigned short timeout = 0xffff;
/* EffacerI2CRDebit[5:3]Les trois. */
base->I2CR &= ~((1 << 5) | (1 << 4) | (1 << 3));
/* Attendez la fin de l'occupation (Délai d'attente) */
while((base->I2SR & (1 << 5)))
{
timeout--;
if(timeout == 0) /* Timeout Out out */
return I2C_STATUS_TIMEOUT;
}
return I2C_STATUS_OK;
}
Configurer les fonctions d'envoi et de réception
void i2c_master_write(I2C_Type *base, const unsigned char *buf, unsigned int size)
{
/* Attendez que la transmission soit terminée */
while(!(base->I2SR & (1 << 7)));
base->I2SR &= ~(1 << 1); /* Effacer les bits du drapeau */
base->I2CR |= 1 << 4; /* Envoyer des données */
while(size--)
{
base->I2DR = *buf++; /* Oui.bufLes données sont écrites àI2DRRegistres */
while(!(base->I2SR & (1 << 1))); /* Attendez que la transmission soit terminée */
base->I2SR &= ~(1 << 1); /* Effacer les bits du drapeau */
if(i2c_check_and_clear_error(base, base->I2SR)) /* Vérifiez s'il y aACK */
break;
}
base->I2SR &= ~(1 << 1);
i2c_master_stop(base); /* Envoyer un signal d'arrêt */
}
void i2c_master_read(I2C_Type *base, unsigned char *buf, unsigned int size)
{
volatile uint8_t dummy = 0;
dummy++; /* Prévenir les erreurs de compilation */
while(!(base->I2SR & (1 << 7))); /* Attendez que la transmission soit terminée */
base->I2SR &= ~(1 << 1); /* Effacer l'interruption en attente */
base->I2CR &= ~((1 << 4) | (1 << 3)); /* Réception des données */
if(size == 1) /* Envoyer si seulement un octet de données est reçu NACKSignal */
base->I2CR |= (1 << 3);
dummy = base->I2DR; /* Fausse lecture */
while(size--) /* Jusqu'à ce que les données soient envoyées */
{
while(!(base->I2SR & (1 << 1))); /* Attendez que la transmission soit terminée */
base->I2SR &= ~(1 << 1); /* Effacer les bits du drapeau */
if(size == 0)
{
i2c_master_stop(base); /* Envoyer un signal d'arrêt */
}
if(size == 1)
{
base->I2CR |= (1 << 3);
}
*buf++ = base->I2DR;
}
}
- Avec les fonctions ci - dessus ,Tous lesIIC Les modules de transmission des données sont complets , La prochaine étape consiste à assembler ces modules ,CompositionIICFonction de transfert pour.
Fonction de transfert
unsigned char i2c_master_transfer(I2C_Type *base, struct i2c_transfer *xfer)
{
unsigned char ret = 0;
enum i2c_direction direction = xfer->direction;
base->I2SR &= ~((1 << 1) | (1 << 4)); /* Effacer les bits du drapeau */
/* Attendez que la transmission soit terminée */
while(!((base->I2SR >> 7) & 0X1)){
};
/* Si c'est lu , Pour envoyer d'abord l'adresse du registre , Alors changez d'orientation pour écrire */
if ((xfer->subaddressSize > 0) && (xfer->direction == kI2C_Read))
{
direction = kI2C_Write;
}
ret = i2c_master_start(base, xfer->slaveAddress, direction); /* Envoyer le signal de départ */
if(ret)
{
return ret;
}
while(!(base->I2SR & (1 << 1))){
}; /* Attendez que la transmission soit terminée */
ret = i2c_check_and_clear_error(base, base->I2SR); /* Vérifiez s'il y a une erreur de transmission */
if(ret)
{
i2c_master_stop(base); /* Erreur d'envoi,Envoyer un signal d'arrêt */
return ret;
}
/* Envoyer l'adresse du registre */
if(xfer->subaddressSize)
{
do
{
base->I2SR &= ~(1 << 1); /* Effacer les bits du drapeau */
xfer->subaddressSize--; /* Longueur de l'adresse moins un */
//VersI2DR Registre écrit sous - adresse
base->I2DR = ((xfer->subaddress) >> (8 * xfer->subaddressSize));
while(!(base->I2SR & (1 << 1))); /* Attendez que la transmission soit terminée */
/* Vérifier si une erreur s'est produite */
ret = i2c_check_and_clear_error(base, base->I2SR);
if(ret)
{
i2c_master_stop(base); /* Envoyer un signal d'arrêt */
return ret;
}
}
while ((xfer->subaddressSize > 0) && (ret == I2C_STATUS_OK));
if(xfer->direction == kI2C_Read) /* Lire les données */
{
base->I2SR &= ~(1 << 1); /* Effacer l'interruption en attente */
/* Envoyer un signal de démarrage répété et une adresse esclave */
i2c_master_repeated_start(base, xfer->slaveAddress, kI2C_Read);
while(!(base->I2SR & (1 << 1))){
};/* Attendez que la transmission soit terminée */
/* Vérifier si une erreur s'est produite */
ret = i2c_check_and_clear_error(base, base->I2SR);
if(ret)
{
ret = I2C_STATUS_ADDRNAK;
i2c_master_stop(base); /* Envoyer un signal d'arrêt */
return ret;
}
}
}
/* Envoyer des données */
if ((xfer->direction == kI2C_Write) && (xfer->dataSize > 0))
{
i2c_master_write(base, xfer->data, xfer->dataSize);
}
/* Lire les données */
if ((xfer->direction == kI2C_Read) && (xfer->dataSize > 0))
{
i2c_master_read(base, xfer->data, xfer->dataSize);
}
return 0;
}
Fichier d 'en - tête
#include "imx6ul.h"
/* Définitions des macros associées */
#define I2C_STATUS_OK (0)
#define I2C_STATUS_BUSY (1)
#define I2C_STATUS_IDLE (2)
#define I2C_STATUS_NAK (3)
#define I2C_STATUS_ARBITRATIONLOST (4)
#define I2C_STATUS_TIMEOUT (5)
#define I2C_STATUS_ADDRNAK (6)
/* * I2C Type d'énumération directionnelle */
enum i2c_direction
{
kI2C_Write = 0x0, /* L'hôte écrit des données à l'esclave */
kI2C_Read = 0x1, /* L'hôte lit les données de l'esclave */
} ;
/* * Structure de transmission hôte */
struct i2c_transfer
{
unsigned char slaveAddress; /* 7 Adresse de l'esclave bit */
enum i2c_direction direction; /* Direction de transmission */
unsigned int subaddress; /* Adresse du registre */
unsigned char subaddressSize; /* Longueur de l'adresse du registre */
unsigned char *volatile data; /* Tampon de données */
volatile unsigned int dataSize; /* Longueur du tampon de données */
};
/* *Déclaration de la fonction */
void i2c_init(I2C_Type *base);
unsigned char i2c_master_start(I2C_Type *base, unsigned char address, enum i2c_direction direction);
unsigned char i2c_master_repeated_start(I2C_Type *base, unsigned char address, enum i2c_direction direction);
unsigned char i2c_check_and_clear_error(I2C_Type *base, unsigned int status);
unsigned char i2c_master_stop(I2C_Type *base);
void i2c_master_write(I2C_Type *base, const unsigned char *buf, unsigned int size);
void i2c_master_read(I2C_Type *base, unsigned char *buf, unsigned int size);
unsigned char i2c_master_transfer(I2C_Type *base, struct i2c_transfer *xfer);
#endif
版权声明
本文为[Swiler]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/04/202204230053490481.html
边栏推荐
- 员工公寓楼建设项目电力监控系统的研究与应用
- C introduction of variable parameter params
- Steps to apply for a CA certificate
- The market structure has entered a period of restructuring, ESP has frequently "recalled", and Chinese suppliers "take advantage of the trend"
- Change your posture to look at hooks, the combination of inspiration sources and the separation of new ideas from logical view in hoc mode
- leetcode 396. 旋转函数
- How do programmers find jobs? What if it becomes more and more difficult for programmers to find a job?
- 安全用电管理平台在靖边博物馆安全用电管理系统的应用
- Lightly: a new generation of cloud IDE
- Soochow securities x kangaroo cloud: the data is easily available and has millisecond response ability. What did Soochow securities do right?
猜你喜欢

BUUCTF 隐藏的钥匙

如何成为真正的数字化企业,锐捷网络发布数字原力觉醒计划

IMX6ULL裸机开发之硬件IIC分析及配置过程

体育训练中心项目电力监控系统的研究与应用

C语言 #和 ##

2.58 - write the program is little endian, which returns 1 when compiled and run on the small end method machine and 0 when compiled and run on the large end method machine. This program should be abl

多测师杭州拱墅校区肖sir_高级金牌讲师_简历制作讲解

【蓝桥杯国赛真题18】Scratch加法选择题 青少年组 scratch蓝桥杯国赛真题和答案讲解

Modify computer IP from the command line

Acrel-2000型电力监控系统在兴庆坊新兴广场配电所配电回路用电的实时监控和管理
随机推荐
二叉搜索树前序序列转中序和后序
Improvement of ref and struct in C 11
Free trial for the first three months! Borui data alarm platform onealert is in progress
C WPF UI framework mahapps switching theme
L2-022 rearrange linked list (25 points) linked list operation
Leetcode 134. Station - service
Acrel-2000型电力监控系统在兴庆坊新兴广场配电所配电回路用电的实时监控和管理
Ifconfig how to get the statistics of network card
Why can't the cursor of the next input box enter after entering the previous input box (the cursor can only be clicked in the front part to enter the input box, and the part after the cursor clicks th
io_ Application of ring technology in distributed cloud native database
Deep learning basic learning - residual
2.58 - write the program is little endian, which returns 1 when compiled and run on the small end method machine and 0 when compiled and run on the large end method machine. This program should be abl
Multi surveyor Xiao sir, Gongshu campus, Hangzhou_ Senior gold medal lecturer_ Resume practice
This new feature of C 11, I would like to call it the strongest!
Mp2459 is a perfect replacement for 60v0 with power MOSFET fs2459 integrated inside 5A step-down IC
Essay 8: error in readpng (paste (location, "/", pattern. Type [i], ". PNG", Sep = "): unable to open C:/
德勤2022技术趋势:IT自我颠覆、技术跨界融合创新
多测师杭州拱墅校区肖sir_高级金牌讲师_简历制作讲解
ethtool查看网卡统计信息的流程
Steps to apply for a CA certificate