2024-10-03 02:20 AM
我目前正在从事一个需要使用 STM32F103C8T6 微控制器和标准库进行代码编写的项目。在此过程中,我遇到了 ANT7-T-ST25DV64KC 芯片初始化的问题,一直卡在“while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT));在此步骤中,我还对读取 I2C_SS0_Dyn 数据感到困惑。读出的数据永远是我在 read 函数中写的 slave 地址,有时读出的数据会增加 1。
这是我的代码
2024-10-03 02:44 AM - last edited on 2024-10-03 02:49 AM by Andrew Neil
I'm currently working on a project that requires code writing using STM32F103C8T6 microcontrollers and standard libraries.
During this process, I ran into an issue with ANT7-T-ST25DV64KC chip initialization and kept getting stuck in "while (!"). I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT)); In this step, I was also confused about reading I2C_SS0_Dyn data. The read data is always the slave address I wrote in the read function, and sometimes the read data will increase by 1.
Here's my code
void ST25DV_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
I2C_InitTypeDef I2C_InitStructure;
NVIC_InitTypeDef NVIC_InitStruct;
SystemClock_Config();
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_Init(GPIOB, &GPIO_InitStructure);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2,ENABLE);
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
I2C_InitStructure.I2C_ClockSpeed = 100000;
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_OwnAddress1 = 0x00;
I2C_Init(I2C2, &I2C_InitStructure);
I2C_Cmd(I2C2,ENABLE);
NVIC_InitStruct.NVIC_IRQChannel = EXTI2_IRQn |EXTI3_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
}
void ANT7_T_ST25DV64KC_WriteReg(uint16_t RegAddress, uint8_t Data)
{
I2C_GenerateSTART(I2C2, ENABLE);
while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT));
I2C_Send7bitAddress(I2C2, ANT7_T_ST25DV64KC_ADDRESS, I2C_Direction_Transmitter);
while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
I2C_SendData(I2C2, (uint8_t)(RegAddress >> 8));
while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTING));
I2C_SendData(I2C2, (uint8_t)(RegAddress & 0xFF));
while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTING));
I2C_SendData(I2C2,Data);
while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_GenerateSTOP(I2C2, ENABLE);
}
uint8_t ANT7_T_ST25DV64KC_ReadReg(uint16_t RegAddress)
{
uint8_t Data;
I2C_GenerateSTART(I2C2, ENABLE);
while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT));
I2C_Send7bitAddress(I2C2, ANT7_T_ST25DV64KC_ADDRESS, I2C_Direction_Transmitter);
while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
I2C_SendData(I2C2, (uint8_t)(RegAddress >> 8));
while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_SendData(I2C2, (uint8_t)(RegAddress & 0xFF));
while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_GenerateSTART(I2C2, ENABLE);
while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT));
I2C_Send7bitAddress(I2C2, ANT7_T_ST25DV64KC_ADDRESS, I2C_Direction_Receiver);
while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
I2C_AcknowledgeConfig(I2C2, DISABLE);
I2C_GenerateSTOP(I2C2, ENABLE);
while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_RECEIVED));
Data = I2C_ReceiveData(I2C2);
I2C_AcknowledgeConfig(I2C2, ENABLE);
return Data;
}
2024-10-03 02:50 AM
Please see the Posting Tips for how to properly post source code:
I've edited the post for you.
2024-10-03 02:57 AM
ty
2024-10-22 07:48 AM
Hello Sjek,
this thread seems similar to the following thread:
How to initialize a mailbox - STMicroelectronics Community
please see this other thread.
thanks and regards,
Cedric.