#1楼主:stm32f关于GPIO的应用
文章发表于:2008-07-18 05:15
在GPIO配置中有:/* Configure I2C1 pins: SDA ----------*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;//GPIO_Mode_AF_OD;
GPIO_Init(GPIOB, &GPIO_InitStructure);
/* Configure SCL as output push-pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
在应用时我这样做错在哪里?如下:
#define I2C_SCL_LOW() GPIO_ResetBits(GPIOB, GPIO_Pin_7)/*模拟I2C时钟控制位*/
#define I2C_SCL_HIGH() GPIO_SetBits(GPIOB, GPIO_Pin_7)
#define I2C_SDA_LOW GPIO_ResetBits(GPIOB, GPIO_Pin_6)/*模拟I2C时钟控制位*/#define I2C_SDA_HIGH GPIO_SetBits(GPIOB, GPIO_Pin_6)
#define I2C_SDA() GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_6)//模拟I2C数据传送位
最后一句是用语句while(I2C_SDA())......
#2
文章发表于:2008-07-18 17:54
语法上没有错。
另外,善意提醒一下,GPIO_Speed可以选用2MHz,使用50MHz时功耗较大。
#3
文章发表于:2008-07-28 17:11
模拟的通过了,我现在想用自身的I2C来操作PCF8563,搞了两个星期了都无果,请赐教!?谢谢!
主程序中我作了如下设置:
void I2C_FLASH_Init(void)
{
I2C_InitTypeDef I2C_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
/* I2C2 Periph clock enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
/* Configure I2C2 pins: SCL and SDA */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
GPIO_Init(GPIOB, &GPIO_InitStructure);
I2C_Cmd(I2C1, ENABLE);
/* Enable I2C1 and I2C2 event and buffer interrupt */
I2C_ITConfig(I2C1, I2C_IT_EVT | I2C_IT_BUF, ENABLE);
/* Apply I2C configuration after enabling it */
/* I2C1 configuration ------------------------------------------------------*/
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_InitStructure.I2C_OwnAddress1 = 0xa0;
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_ClockSpeed = 5000;
I2C_Init(I2C1, &I2C_InitStructure);
}
在PCF8563的读写程序中我做了如下操作:
void writeData(unsigned char address,unsigned char mdata)
{ I2C_AcknowledgePolling();
I2C_GenerateSTART(I2C1,ENABLE);
I2C_SendData(I2C1,0xa2);//写命令
I2C_SendData(I2C1,address);//写地址
I2C_SendData(I2C1,mdata); //写数据
I2C_AcknowledgeConfig(I2C1,DISABLE);
I2C_GenerateSTOP(I2C1,ENABLE);
}
unsigned char ReadData(unsigned char address) /*单字节*/
{ unsigned char rdata;
I2C_AcknowledgePolling();
I2C_GenerateSTART(I2C1,ENABLE);
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));
I2C_SendData(I2C1,0xa2);//写命令
while(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
I2C_SendData(I2C1,address);//写地址
I2C_AcknowledgePolling();
I2C_GenerateSTART(I2C1,ENABLE);
I2C_SendData(I2C1,0xa3); //读命令
rdata="I2C"_ReceiveData(I2C1);
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
I2C_AcknowledgeConfig(I2C1,DISABLE);
I2C_GenerateSTOP(I2C1,ENABLE);
return(rdata);
}
void ReadData1(unsigned char address,unsigned char count,unsigned char * buff) /*多字节*/
{
unsigned char i;
I2C_AcknowledgePolling();
I2C_GenerateSTART(I2C1,ENABLE);
while(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));
I2C_SendData(I2C1,0xa2);//写命令
I2C_SendData(I2C1,address);//写地址
I2C_AcknowledgePolling();
I2C_GenerateSTART(I2C1,ENABLE);
I2C_SendData(I2C1,0xa3); //读命令
for(i=0;i<count;i++)
{
buff[i]=I2C_ReceiveData(I2C1);
if(i!=count-1) ;while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_RECEIVED));
}
I2C_AcknowledgeConfig(I2C1,DISABLE);
I2C_GenerateSTOP(I2C1,ENABLE);
}
void I2C_AcknowledgePolling(void){
unsigned int q="I2C"_ReadRegister(I2C1,I2C_Register_SR1);
do{
I2C_GenerateSTART(I2C1,ENABLE);
I2C_ReadRegister(I2C1,I2C_Register_SR1);//清除ADDR位
I2C_Send7bitAddress(I2C1,0x30,I2C_Direction_Transmitter);
q="I2C"_ReadRegister(I2C1,I2C_Register_SR1);
}while(!q);
while(!(I2C_ReadRegister(I2C1,I2C_Register_SR1)&0x0002));
I2C_ClearFlag(I2C1,I2C_FLAG_AF);
}
#5
文章发表于:2008-07-30 09:05
有可能是GPIO的配置问题,我作USART1测试时,也是可以软件模拟,硬件就不行,后来发现GPIO需要配置成复用输入,或者复用输出,不然端口,还是普通端口,不会成为USART端口或者I2C端口!