2019-03-23 15:05发布
huaiqiao 发表于 2016-8-15 19:02 那我就不知道了,你这个片子我也没有用过,前面只是大概的跟你探讨下思路。。。。
nevergodie 发表于 2016-8-16 09:06 好的,谢谢指教。
nevergodie 发表于 2016-8-17 11:36 好吧,最后发现还是以前的问题,没有ACK返回。但是在这之前的CLK,SDA都是按照说明写的,现在很茫然
nevergodie 发表于 2016-8-18 09:34 已经能通过i2c,但是获取的数据感觉有问题。
最多设置5个标签!
好的,谢谢指教。
- #define SDA_IN {RCC->APB2ENR|=(unsigned int)1<<3;GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(unsigned int)8<<28;GPIOB->ODR|=(unsigned int)1<<7;}
- #define SDA_OUT {RCC->APB2ENR|=(unsigned int)1<<3;GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(unsigned int)3<<28;GPIOB->ODR|=(unsigned int)1<<7;}
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
- GPIO_SetBits(GPIOB,GPIO_Pin_6);
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
- GPIO_Init(GPIOB,&GPIO_InitStructure);
- GPIO_SetBits(GPIOB,GPIO_Pin_7);
- void IIC_SendByte(char ch)
- {
- char i;
- SDA_OUT; //to enable SDATA pin as an output
- AD7746_SCLK = 0; //make sure that the clock line is low
- //delay(20);
- for(i=0;i<8;i++)
- {
- AD7746_SDAout=0;
- if(ch&0x80)
- AD7746_SDAout=1;
- else
- AD7746_SDAout=0;
- ch = ch<<1;
- delay(5);
- AD7746_SCLK = 1; //clock to send bit
- delay(5);
- AD7746_SCLK = 0; //clear clock
- delay(5);
- //move ch's bit
- }
- SDA_IN; //release data line for acknowledge
-
- AD7746_SCLK = 1; //send clock for acknowledge
- delay(2);
- //AD7746_SDAout=1;
- //delay(2);
- if(!AD7746_SDAin) //no acknowledge, set flag
- {
-
- IIC_Flag |= 1<<NOACK;
- }
-
- delay(20);
- AD7746_SCLK = 0; //clear clock
- }
- void CDC_RDCAP(void)
- {
- IIC_StartBit();
- IIC_SendByte(SLAVEADD);
- if(!(IIC_Flag&(1<<NOACK)))
- IIC_SendByte(CDC_CAPDATA_ADDR);
- if(!(IIC_Flag&(1<<NOACK)))
- {
- IIC_StartBit(); //re-start
- IIC_SendByte(SLAVEADD+1); //read function
- }
- if(!(IIC_Flag&(1<<NOACK)))
- CapResult_H = IIC_RcvByte(0); //read cap data reg
- if(!(IIC_Flag&(1<<NOACK)))
- CapResult_M = IIC_RcvByte(0);
- if(!(IIC_Flag&(1<<NOACK)))
- CapResult_L = IIC_RcvByte(1);
- IIC_StopBit();
- if(IIC_Flag&(1<<NOACK))
- IIC_Flag |= 1<<ERR;
- }
复制代码从官网的例程中,没有启发?还是没有下载官网的例程?
楼主啊,这个不能靠感觉啊。你计算一定要有肯定的数据的。你这个不是计算电容的吗,那你就拿几个小电容(规格一定的)来用这个芯片来计算。这样更有理由说明你的算法等等的是否正确呢。
以上,我只是举个例子,实际是不是这样做,还是要看你的电路跟程序适用的环境等等的呢。
一周热门 更多>