N76E003 模拟IIC 读写陀螺仪模块

发布者:快乐航程最新更新时间:2022-08-15 来源: csdn关键字:N76E003  模拟IIC 手机看文章 扫描二维码
随时随地手机看文章

N76E003   <========IIC========>  脱落仪模块(IIC Slave)


IIC 模拟部分代码:


bsp_iic.c


#include "bsp_iic.h"

 

unsigned char SDA_READ(void)

{

    if(SDA_RD)

        return 1;

    else

        return 0;

}

 

void delay_10us(unsigned int dly)

{

    Delay10us(dly);

}

 

void IIC_Start(void)

{

    SDA_H();

    SCL_H();

    delay_10us(RW_DELAY);

    SDA_L();

    delay_10us(RW_DELAY);

    SCL_L();

}

 

void IIC_Stop(void)

{

    SDA_L();

    SCL_L();

    delay_10us(RW_DELAY);

    SCL_H();

    delay_10us(RW_DELAY);

    SDA_H();

    delay_10us(RW_DELAY);

}

 

 

void IIC_Ack(void)

{

SCL_L();

    SDA_L();

    delay_10us(RW_DELAY);

    SCL_H();

    delay_10us(RW_DELAY);

    SCL_L();

}

 

void IIC_NAck(void)  

{

    SCL_L();

    SDA_H();

    delay_10us(RW_DELAY);

    SCL_H();

    delay_10us(RW_DELAY);

    SCL_L();

}

 

unsigned char IIC_Wait_Ack(void)

{

    unsigned char ucErrTime = 0;

 

    SDA_H();

    delay_10us(1);

    SCL_H();

    delay_10us(1);

    

    while(SDA_READ()) {

        ucErrTime++;

        if(ucErrTime > 250) {

            IIC_Stop();

            return 1;

        }

    }    

 

    SCL_L();

 

    return 0;

}

 

void IIC_WriteByte(unsigned char SendByte)

{

    unsigned char t;

      

    SCL_L(); // Set CLK as low to start

    delay_10us(RW_DELAY);

    for (t = 0; t < 8; t++) {

        if ((SendByte & 0x80) >> 7) {

            SDA_H();

        } else {

            SDA_L();

        }

 

        SendByte <<= 1;

 

        delay_10us(RW_DELAY);

        SCL_H();

        delay_10us(RW_DELAY);

        SCL_L();

        delay_10us(RW_DELAY);

    }

}

 

unsigned char IIC_ReadByte(unsigned char ack)

{

    unsigned char i, receive = 0;

 

    SCL_L();

    for (i = 0; i < 8; i++) {

        delay_10us(RW_DELAY);

        SCL_H();

        receive <<= 1;

        if (SDA_READ()) {

            receive++;

        }

 

        delay_10us(RW_DELAY);

        SCL_L();

        delay_10us(RW_DELAY);

    }

    

    if (!ack) {

        IIC_NAck();

    } else {

        IIC_Ack();

    }

 

    return receive;

}

 

void write_add(unsigned char slaveaddr,unsigned char regaddr,unsigned char dat)

{

IIC_Start();

IIC_WriteByte(slaveaddr | IIC_WR);

IIC_Wait_Ack();

IIC_WriteByte(regaddr);

IIC_Wait_Ack();

    delay_10us(10);

IIC_WriteByte(dat);

IIC_Wait_Ack();

IIC_Stop();

}

 

unsigned char read_add(unsigned char slaveaddr,unsigned char regaddr)

{

unsigned char dat;

IIC_Start();

IIC_WriteByte(slaveaddr | IIC_WR);

IIC_Wait_Ack();

IIC_WriteByte(regaddr);

IIC_Wait_Ack();

    IIC_Stop();

    //delay_10us(10);

IIC_Start();

IIC_WriteByte(slaveaddr | IIC_RD);

IIC_Wait_Ack();

dat=IIC_ReadByte(0);

IIC_Stop();

 

return dat;

}

 

u8 IIC_WriteToSlave(u8 DevAddr, u8 RegAddr, u8 len, u8 *WData)

{

    u8 i;

    

    IIC_Start();

    

    IIC_WriteByte( DevAddr|0x00);//???,???????

    if(IIC_Wait_Ack())  //1 Ack Failed, 0 Ack Success

        return 1;

    

    IIC_WriteByte(RegAddr);//???

    if(IIC_Wait_Ack())  //1 Ack Failed, 0 Ack Success

        return 2;

    

    for(i = 0; i < len; i++)

    {

        IIC_WriteByte(WData[i]);//???

        if(IIC_Wait_Ack())  //1 Ack Failed, 0 Ack Success

            return 3;

    }

    

    IIC_Stop();

    

    return 4;

}

 

 

u8 IIC_ReadFromSlave(u8 DevAddr, u8 RegAddr, u8 len, u8 *RData)

{

IIC_Start();

    

    IIC_WriteByte( DevAddr|0x00);//???,???????

    if(IIC_Wait_Ack())  //1 Ack Failed, 0 Ack Success

        return 1;

    

    IIC_WriteByte(RegAddr);//???

    if(IIC_Wait_Ack())  //1 Ack Failed, 0 Ack Success

        return 2;

    

    IIC_Start();

    IIC_WriteByte( DevAddr|0x01);//???,???????

    if(IIC_Wait_Ack())  //1 Ack Failed, 0 Ack Success

        return 3;

    

    while(len)

    {

        if(len == 1)

        {

            *RData = IIC_ReadByte(0);  //???,??????nAck

        }

        else

        {

            *RData = IIC_ReadByte(1);  //??????????????Ack

        }

        len--;

        RData++;

    }

    IIC_Stop();

    

    return 4;

}

 

//================TEST====================

#define SLAVE_ADDR      0xAA

 

void IIC_TEST(void)

{

    

//    SDA_H();

//    SCL_H();

//    delay_10us(10);   

//    SDA_L();

//    SCL_L(); 

//    delay_10us(10);  

    

    u8 res;

    u8 temp_arr_pitch[2];

    u8 temp_arr_roll[2];

    u8 temp_arr_yaw[2];

    signed short pitch, roll,yaw;

    

    res = IIC_ReadFromSlave(SLAVE_ADDR, 0x3D, 2, temp_arr_pitch);

    

    delay_10us(300); 

//    //dbg(0, ("res = %bxrn",res));

    res = IIC_ReadFromSlave(SLAVE_ADDR, 0x3E, 2, temp_arr_roll);

    res = IIC_ReadFromSlave(SLAVE_ADDR, 0x3F, 2, temp_arr_yaw);

//    

//    pitch = (temp_arr_pitch[0]<<8) | temp_arr_pitch[1];   //??????X -90~90

//    roll  = (temp_arr_roll[0]<<8)  | temp_arr_roll[1];    //??o???Y -180~180   

//    yaw   = (temp_arr_yaw[0]<<8)   | temp_arr_yaw[1];     //Dy¡Áa??Z -180~180 

//    

//    //dbg(0, ("pitch: %+6d,  roll:%+6d,   yaw:%+6drn",pitch, roll, yaw));

}


bsp_iic.h


#ifndef __BSP_IIC_H

#define __BSP_IIC_H

#include "N76E003.h"

#include "Common.h"

#include "Delay.h"

 

/*<-------------------N76E003 Ä£Äâ IIC------------------>*/

 

typedef unsigned char u8;

 

/**

 * P00   SCL

 * P01   SDA

 */

 

#define SDA_RD              P01         //SDA READ

#define SDA_H()             (P01 = 1)      //SDA HIGH

#define SDA_L()             (P01 = 0)      //SDA LOW

 

#define SCL_H()             (P00 = 1)      //SCL HIGH

#define SCL_L()             (P00 = 0)      //SCL LOW

 

#define RW_DELAY            1               //unit 10us

 

#define IIC_WR              0               //IIC Write cmd

#define IIC_RD              1               //IIC Read cmd

 

unsigned char SDA_READ(void);

void delay_10us(unsigned int dly);

void IIC_Start(void);

void IIC_Stop(void);

void IIC_Ack(void);

void IIC_NAck(void);

unsigned char IIC_Wait_Ack(void);

void IIC_WriteByte(unsigned char SendByte);

unsigned char IIC_ReadByte(unsigned char ack);

void write_add(unsigned char slaveaddr,unsigned char regaddr,unsigned char dat);

unsigned char read_add(unsigned char slaveaddr,unsigned char regaddr);

u8 IIC_WriteToSlave(u8 DevAddr, u8 RegAddr, u8 len, u8 *WData);

u8 IIC_ReadFromSlave(u8 DevAddr, u8 RegAddr, u8 len, u8 *RData);

void IIC_TEST(void);

 

 

#endif /* __BSP_IIC_H */


main.c的调用:


void main (void) 

{

Set_All_GPIO_Quasi_Mode; // Define in Function_define.h

InitialUART0_Timer3(115200);

set_CLOEN;

while(1)

{

        IIC_TEST();

    }

}

 


IIC clk速度设置到最快:

关键字:N76E003  模拟IIC 引用地址:N76E003 模拟IIC 读写陀螺仪模块

上一篇:N76E003 学习三 按键控制LED亮灭
下一篇:N76E003 单片机 IIC 软模拟

推荐阅读最新更新时间:2024-11-08 18:56

标准IIC和IO口模拟IIC之间的主从机通信区别
主机用的是标准IIC发送及接受数据,从机用的是IO口模拟的IIC两者之间的通信需要注意的地方: 1.主机使用标准IIC发送数据时,发送函数几乎不用改动,直接按照芯片给的标准IIC发送函数。但是接收函数有几点需要注意的地方,因为标准IIC发送地址是用的是这个函数 I2C_Send7bitAddress(address,IEC_DIRECTION_RX);这个函数的特点是发送和接收的发送地址都是用这个函数,但是如何区别它到底是发送时地址还是接收时地址呢?后面的那个参数就是一个标志,RX是接收,TX是发送,其中TX=0X00,RX=0X01;这在IO口模拟时是没有检验的(可见标准IIC还是很大稳定性的,呵呵),通过这个函数
[单片机]
标准<font color='red'>IIC</font>和IO口<font color='red'>模拟</font><font color='red'>IIC</font>之间的主从机通信区别
N76E003双串口中断配置、问题及解决方法
更正 发现造成该原因是由于TI/RI只要进入中断,就会一起打开造成,针对此情况需要在中断服务函数中将其置低,否则中断响应将一直存在。建议在串口中断中除了对RI进行置低外,还对TI进行置低(代码已修改)。此外我两年前测试时在接收中断中使用的send_data_to_uart1()函数,其会在发送前先将TI置低,后发送完成后会硬件置低,也可能是因为此原因,导致中断能顺利运行。 再次对找到原因的大佬表示感谢,也对那些曾被我误导的同学道歉。 原回答 最近在调试N76E003串口0,串口1中断时,发现当串口0开启中断后,串口1中断无法正常工作,下面详细说说自己的办法。(我的问题原因是中断优先级造成的,取消串口1中断优先级即可解决)
[单片机]
<font color='red'>N76E003</font>双串口中断配置、问题及解决方法
STM32模拟IIC驱动OLED屏 原理+源码
处理器和芯片间的通信可以形象的比喻成两个人讲话:1、你说的别人得能听懂:双方约定信号的协议。2、你的语速别人得能接受:双方满足时序要求。 一、IIC总线的信号类型 1、开始信号:处理器让SCL时钟保持高电平,然后让SDA数据信号由高变低就表示一个开始信号。同时IIC总线上的设备检测到这个开始信号它就知道处理器要发送数据了。 2、停止信号:处理器让SCL时钟保持高电平,然后让SDA数据信号由低变高就表示一个停止信号。同时IIC总线上的设备检测到这个停止信号它就知道处理器已经结束了数据传输,我们就可以各忙各个的了,如休眠等。 二、IIC数据传输过程 1、在数据传输时,SDA的数据在SCL为高电平时,必须保持稳定
[单片机]
STM32<font color='red'>模拟</font><font color='red'>IIC</font>驱动OLED屏 原理+源码
新唐的N76E003 pin对pin替换STM8S003F3P6
新唐的N76E003 pin对pin替换STM8S003F3P6,而且很便宜,故这个时候拿来替换使用再好不过。 下面开始准备资料和搭建环境: 一、直接上新唐官网,搜索“N76E003”,下载下面的资料: 前面两个BSP分别是IAR和Keil的示范例程;第三个是Keil的支持包和下载器的USB驱动;第三个是ISP的支持包,可以通过内含的软件串口下载程序,就像51单片机一样,但是前提是先给MCU烧写了BootLoader,这个有点坑,你得先通过nu-link-pro和Nu-Link-Me把ISP的BootLoader烧进去,才能使用ISP。 程序烧写器和在线调试器是nu-link-pro和Nu-Link-Me。 开发软
[单片机]
新唐的<font color='red'>N76E003</font> pin对pin替换STM8S003F3P6
Nuvoton_N76E003使用教程
一、搭建开发环境 1、下载并安装Keil C-51 uVersion: 2、下载并安装Nu-Link_Keil_Driver 二、运行示例代码 1、下载N76E003示例代码: 2、点击Keil C-51 “project”– “open project …”,打开示例代码“GPIO”,路径:N76E003_SampleCode_Keil_C51_V1.0Sample_Code1.GPIO: 3、执行示例代码: 注意:1为编译代码。2为下载代码到芯片,必须正确外接烧录器与目标芯片才能执行。3为调试代码,必须正确外接烧录器与目标芯片才能执行。 三、新工程与配置Keil C-51 uVersion 1、新建
[单片机]
Nuvoton_N76E003使用教程
PIC16 PCF8591
模拟IIC的方式 PIC16F887 XCV1.41 #define SCL_H TRISC0 = 0, RC0 = 1 /* SCL管脚置高 IIC两个通信端口 */ #define SCL_L TRISC0 = 0, RC0 = 0 /* SCL管脚置低 */ #define SDA_H TRISC1 = 0, RC1 = 1 /* SDA管脚置高 */ #define SDA_L TRISC1 = 0, RC1 = 0 /* SDA管脚置低 */ #define SDA_IN TRISC1 = 1 /* SDA输入模式 */ #define SDA_OUT
[单片机]
PIC16 PCF8591
N76E003 DHT11
#include N76E003.h #include Common.h #include Delay.h #include SFR_Macro.h #include Function_define.h #define uint unsigned int #define uchar unsigned char uint WtkCount=0; bit WtkFlag=0; sbit DATA_PIN=P1^5; //温湿度定义 uchar ucharFLAG,uchartemp; uchar shidu_shi,shidu_ge,wendu_shi,wendu_ge=4; uchar ucharT
[单片机]
<font color='red'>N76E003</font> DHT11
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved