l3g4200d,stm32模拟i2c
本文目录索引
- 1,stm32模拟i2c
- 2,单片机模拟IIc总线通信
- 3,单片机 iic总线 c/c++ 通讯
- 4,同样的I2C程序用24c02能正常通讯,用MPU6050陀螺仪芯片却一直收不到应答信号是为什么?
- 5,传感器采集来的数据怎么插入到数据库中?
1,stm32模拟i2c
1 肯定是复用模式了 GPIO_Mode_Out_AFOD;
2 你连这个都不知道,那注意的有很多了
3 你理解错了 每一个外设都可以设置一个时钟,而且管脚复用后芯片内部的连接和原来的没有关系,也就是说你只要设置好I2C的时钟就可以了
4 恩......100k?不好意思,不太清楚。怎么控制?你把 3 弄明白了就会了。
别告诉我你要拿IO口模拟,虽然也不难。
2,单片机模拟IIc总线通信
对于疑问1:for循环已经把数据从主器件发送到从器件,没错,后面加那几句是为了释放数据总线,这是芯片协议已经规定了的,为什么是scl=0;而sda=1呢,应该总线SCL与SDA都是线与关系,任意一个器件输出低电平,都使该总线的信号变低,你可能会这么想:为什么不是scl=1;delay();sda=1;delay();呢?那是因为当scl=1;sda=1;这是终止信号。对吧,这样写的话IIC将会停止工作。
对于疑问2:加这几句也一样,是芯片现已规定:无论是写数据还是读数据,写完读完之后需释放总线,for循环语句的意思是:
for(i=0;i<8;i++)
{
scl=1; //拉高时钟总线,开始读数据
delay();
k=(k<<1)|sda; // 将读取到的sda数据存放到k中,这里你可能有点无法理解,我举个例子:刚开始k=0x00(系统默认),当读取到的sda数据为1时,k=0x01;对吧,反之当读取到的sda数据为0时,k=0x00;
scl=0;// 读取完一个数据,拉低时钟总线
delay();
}
就这样循环8次,这样一个字节的数据就从主器件读到了从器件了。对吧。
如果那个释放总线你理解不了,你就记住,这是芯片协议规定,读完或写完都必须释放总线。iic协议都是如此。
希望能帮助到你。
3,单片机 iic总线 c/c++ 通讯
了解一下IIC通信协议,也可以直接下载支持IIC的器件资料来看。在写字节过程中,SCL表示移位脉冲,SDA表示移位的数据。这个子程序中,SCL上跳沿时,SDA的状态为移位的内容。高位在前,先发送。发送完成后恢复到总线空闲状态。
这个子程序未验证,其意图是SDA每次送出temp变量的最高位。CY为PSW的进位标志,在移位ACC指令RLC时会受影响。CY总是指示上一次移位时被发送字节的最高位。
4,同样的I2C程序用24c02能正常通讯,用MPU6050陀螺仪芯片却一直收不到应答信号是为什么?
根据你提供的信息, 请按下面的方法逐步排查:
1. 确定物理连接SCL/SDA没有问题 (包括引脚接错, 虚焊等), 万用表量一下两个引脚有没有连接. 还有上拉电阻(我记得I2C总线要接上拉电阻)等外部电路有没有问题.
2. 检查MPU6050有没有进入工作状态, 电源, 晶振的配置, 各个引脚(特别是CS, VLogic, AD0等)的连接都是处于正确状态.
3. 确保MPU6050的地址应该为0x68和0xE8(AD0=0)或者0x69或者0xE9(AD0=1) 规格书9.2节, 33页
4. 读写时序有没有在MPU6050的要求范围内, 可以用示波器观察SCL的频率, 上升沿, 下降沿有没有达到MPU6050的规格书要求. 不过你能读24c02, 速度应该没有问题. 保险起见, 用示波器观察一下, 通讯的波形有没有衰减.
5,传感器采集来的数据怎么插入到数据库中?
把传感器的采集的数据传入数据库,可以通过C#编程和ZIGBEE技术来实现啊,可以用visual stdio 2008或2010把串口程序写好,然后把用IAR 写好的软件下到目标板中就是ZigBee开发板, 程序中需要添加连接到数据库的函数,先建好数据库以及你要采集的信息数据的一个综合的表格,就是数据库中表格的各项列值,这个列的名称和串口程序里的值是一致的,附上代码表示 using System.Data.SqlClient; public partial class Form1 : Form { string ConStr; SqlConnection conn; public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { ConStr = "server=.;database=Studend;Integrated Security=SSPI;"; conn = new SqlConnection(ConStr); conn.Open(); string name = textBox1.Text; name = "'" + name + "'"; string passwd = textBox2.Text; try { SqlCommand sqlcom = new SqlCommand("insert into luo(name,password) values(" + name + " ," + passwd + ")", conn); sqlcom.ExecuteNonQuery(); MessageBox.Show("连接成功!", "!"); } catch (Exception a) { MessageBox.Show("未添加!","!"); } } private void Form1_Load(object sender, EventArgs e) { ConStr = "server=.;database=Studend;Integrated Security=SSPI;"; conn = new SqlConnection(ConStr); conn.Open(); if (conn.State == ConnectionState.Open) { label5.Text = "连接成功并打开数据库"; //conn.Close(); } } private void button3_Click(object sender, EventArgs e) { ConStr = "server=.;database=Studend;Integrated Security=SSPI;"; conn = new SqlConnection(ConStr); conn.Open(); if (conn.State == ConnectionState.Open) { label5.Text = "连接成功并打开数据库"; //conn.Close(); } } private void button2_Click(object sender, EventArgs e) { ConStr = "server=.;database=Studend;Integrated Security=SSPI;"; conn = new SqlConnection(ConStr); string name2 = textBox3.Text; name2 = "'" + name2 + "'"; conn.Open(); try { SqlCommand sqlcom = new SqlCommand("delete from luo where name=" + name2, conn); int a=sqlcom.ExecuteNonQuery(); if (a <=0) {MessageBox.Show("删除失败!","!"); } else MessageBox.Show("删除成功!", "!"); conn.Close(); } catch (Exception a) { MessageBox.Show("未删除!","!"); } }