Bonjour,
Je souhaite communiquer la donnée 0x55 d'une carte STM8L-Discovery vers une autre carte du même type afin de tester le protocole de communication I2C.
Pour cela voici mon code :
- Je choisis l'adresse 0x01 pour le MASTER
- Je choisis l'adresse 0x11 pour le SLAVE
Méthode :
D'écrite dans les commentaires ci dessous.
Ma question :
Je teste la communication en me plaçant à la sortie du port SDA et SCL et je regarde à l'oscilloscope les trames passantes.
Le problème c'est que mon code code tourne mais en sortie du port SCL(la clock), il n'y a pas de signal.
Et même chose pour le port SDA, je choisis de communiquer la data 0x55 en hexa est donc je devrais voir sur mon oscilloscope la trame définit ainsi : 0 1 0 1 0 1 0 1 ...
Est ce que mon code vous parait correct tout d'abord pour la comm i2c? Il y a t'il des modifications à apporter ?
/***********************/
Author : Meynadier Armand
FlagStatus test=RESET;
ErrorStatus testt=ERROR;
int status; //chef flag pour l'i2c
GPIO_Init(GPIOC, GPIO_Pin_0, GPIO_Mode_Out_OD_HiZ_Fast); //GPIO_Mode_In_PU_No_IT
GPIO_Init(GPIOC, GPIO_Pin_1, GPIO_Mode_Out_OD_HiZ_Fast); //GPIO_Mode_In_PU_No_IT
//clock synchro avec i2c1
CLK_PeripheralClockConfig(CLK_ Peripheral_I2C1,ENABLE);
//initialisation de la comm I2C, 1MHz, ack enable
I2C_DeInit(I2C1);
I2C_Init(I2C1, I2C_MAX_STANDARD_FREQ, 0x01, I2C_Mode_I2C ,I2C_DutyCycle_2,I2C_Ack_Enabl e,I2C_AcknowledgedAddress_7bit );
//Activation de la comm du peripherique i2c
I2C_Cmd(I2C1, ENABLE);
while ( 1 )
{
//i2c comm
// on vérifie que le port i2c est libre
test=I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY);
while (test==SET);
//Envoyer la condition de depart de la comm
I2C_GenerateSTART(I2C1, ENABLE);
//on vérifie si le master mode est selectionné
testt = I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT);
while (testt==RESET);
//adress du slave on donne la direction de la communication
I2C_Send7bitAddress(I2C1, 0x11, I2C_Direction_Receiver );
//on vérifie que le mode emetteur est selectionné
testt = I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_M ODE_SELECTED);
while (testt==RESET);
//Envoie la donnée 55, à l'oscillo on aura 0 1 0 1 0 1 0 1 ...
I2C_SendData(I2C1,0x55);
//On vérifie que la donnée a été transféré
testt = I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMIT TED);
while (testt==RESET);
//on stoppe la comm
I2C_GenerateSTOP(I2C1, ENABLE);
//on lit le registre de donné et on le stock dans un entier
status=I2C_ReadRegister(I2C1, I2C_Register_DR);
//on check si l'évènement a été recu
//status=I2C_CheckEvent(I2C1,I2C _EVENT_SLAVE_BYTE_RECEIVED);
}
}
/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/
-----