ST32的I2C接口问题
时间:10-02
整理:3721RD
点击:
我想用STM32F103VET6控制 I2C接口的数字电位器 X9119 。
不知道怎么控制,谁可以帮我下。
主要是时序我都知道,我也看了野火的I2C的E2PROM的DEMO,
我想用DEMO改下 来控制X9119 但是不得要领,谁知道麻烦告知下。
时序图我已经发上来了。
求哪位大神指点下
我用的是I2C 2接口 PB10.PB11,改的野火 I2C E2PROM。DEMO
static void I2C_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* 使能与 I2C1 有关的时钟 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2,ENABLE);
/* PB6-I2C1_SCL、PB7-I2C1_SDA*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10| GPIO_Pin_11; 就是改个接口其他没变
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; // 开漏输出
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
/*
* 函数名:I2C_Configuration
* 描述 :I2C 工作模式配置
* 输入 :无
* 输出 :无
* 调用 :内部调用
*/
static void I2C_Mode_Configu(void)
{
I2C_InitTypeDef I2C_InitStructure;
/* I2C 配置 */
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_InitStructure.I2C_OwnAddress1 =I2C1_OWN_ADDRESS7; //地址我已经改了
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable ;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_ClockSpeed = I2C_Speed;
/* 使能 I2C1 */
I2C_Cmd(I2C2, ENABLE);
/* I2C1 初始化 */
I2C_Init(I2C2, &I2C_InitStructure);
}
改的是GPIO,不知道有没有问题。
重要就是下面
void I2C_TIST(void)
{
while(I2C_GetFlagStatus(I2C2, I2C_FLAG_BUSY)); // Added by Najoua 27/08/2008
/* Send START condition */
I2C_GenerateSTART(I2C2, ENABLE);
/* Test on EV5 and clear it */
while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT));
/* Send EEPROM address for write */
I2C_Send7bitAddress(I2C2,0X50, I2C_Direction_Transmitter);//地址为01010000
/* Test on EV6 and clear it */
while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
/* Send the EEPROM's internal address to write to */
I2C_SendData(I2C2, 0xC0); //写寄存器
/* Test on EV8 and clear it */
while(! I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_SendData(I2C2, 0x00); //写寄存器数据
/* Test on EV8 and clear it */
while(! I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_SendData(I2C2, 0xFF); //写寄存器数据
/* Test on EV8 and clear it */
while(! I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
/* Send STOP condition */
I2C_GenerateSTOP(I2C2, ENABLE);
}
上面的我就不知道怎么改了,
希望大神告知
不知道怎么控制,谁可以帮我下。
主要是时序我都知道,我也看了野火的I2C的E2PROM的DEMO,
我想用DEMO改下 来控制X9119 但是不得要领,谁知道麻烦告知下。
时序图我已经发上来了。
求哪位大神指点下
我用的是I2C 2接口 PB10.PB11,改的野火 I2C E2PROM。DEMO
static void I2C_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* 使能与 I2C1 有关的时钟 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2,ENABLE);
/* PB6-I2C1_SCL、PB7-I2C1_SDA*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10| GPIO_Pin_11; 就是改个接口其他没变
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; // 开漏输出
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
/*
* 函数名:I2C_Configuration
* 描述 :I2C 工作模式配置
* 输入 :无
* 输出 :无
* 调用 :内部调用
*/
static void I2C_Mode_Configu(void)
{
I2C_InitTypeDef I2C_InitStructure;
/* I2C 配置 */
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_InitStructure.I2C_OwnAddress1 =I2C1_OWN_ADDRESS7; //地址我已经改了
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable ;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_ClockSpeed = I2C_Speed;
/* 使能 I2C1 */
I2C_Cmd(I2C2, ENABLE);
/* I2C1 初始化 */
I2C_Init(I2C2, &I2C_InitStructure);
}
改的是GPIO,不知道有没有问题。
重要就是下面
void I2C_TIST(void)
{
while(I2C_GetFlagStatus(I2C2, I2C_FLAG_BUSY)); // Added by Najoua 27/08/2008
/* Send START condition */
I2C_GenerateSTART(I2C2, ENABLE);
/* Test on EV5 and clear it */
while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT));
/* Send EEPROM address for write */
I2C_Send7bitAddress(I2C2,0X50, I2C_Direction_Transmitter);//地址为01010000
/* Test on EV6 and clear it */
while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
/* Send the EEPROM's internal address to write to */
I2C_SendData(I2C2, 0xC0); //写寄存器
/* Test on EV8 and clear it */
while(! I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_SendData(I2C2, 0x00); //写寄存器数据
/* Test on EV8 and clear it */
while(! I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_SendData(I2C2, 0xFF); //写寄存器数据
/* Test on EV8 and clear it */
while(! I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
/* Send STOP condition */
I2C_GenerateSTOP(I2C2, ENABLE);
}
上面的我就不知道怎么改了,
希望大神告知
X9119时序图
X9119读写指令
24C02时序图
好像STM32寄存器操作IIC通信有问题,还是自己模拟吧,这样也不受单片机端口限制,用起来更加方便。具体怎么模拟的网上都有的。
不会程序的飘过
通信协议问题,,应该看看数字电位器 X9119,逻辑,但是这个电位器我没有用过,通信问题应该看电位器手册,
I2C通信协议有问题 你在网上下载一个通信协议手册看看吧
这类问题应该看你要使用的器件的数据手册
STM32寄存器操作IIC通信有问题。兄弟你在好好研究下吧
还是自己模拟吧,这样也不受单片机端口限制,用起来更加方便。具体怎么模拟的网上都有的。