精华内容
下载资源
问答
  • 写这篇文章的缘由,因为市面上很多DSP其实内部是具有硬件I2C接口的,但由于网络上大部分资料和例程都是利用IO口模拟I2C时序进而实现I2C通讯的。给很多想学习硬件I2C通讯的小伙伴带来了困难。 下面先介绍一下配置步骤...

    dsp即数字信号处理器,是一种广泛应用的嵌入式处理器,主要应用是实时快速地实现各种数字信号处理算法,目前,国际主要的dsp供应商是ti公司,其tms32系列产品占据了dsp市场近一半的份额,本文以TMS320F28377D为例,使用ti公司dsp开发工具ccs10.1配置i2c模块。
    写这篇文章的缘由,因为市面上很多DSP其实内部是具有硬件I2C接口的,但由于网络上大部分资料和例程都是利用IO口模拟I2C时序进而实现I2C通讯的。给很多想学习硬件I2C通讯的小伙伴带来了困难。

    下面先介绍一下配置步骤
    1.Enable I2C clock使能时钟
    configure the PSC register(if it is driven by PSC)PSC相关说明可以查看手册
    2. Configure the PinMultiplexing registers配置管脚
    3. Place I2C in reset先复位I2C
    set IRS =0 in ICMDR register
    4.Configure the peripheral clock operation frequency(ICPSC)配置外设时钟运行频率
    NOTE:the frequency should be between 6.7 and 13.3MHz(常配置为10MHZ
    5.Configure i2c master clock frequency:配置I2C主时钟频率
    configure ICCLKL , ICCLKH
    6.Make sure the interrupt status register(ICSTR) is cleared:(配置中断
    Read ICSTR and write it back (write 1 to clear) ICSTR = ICSTR
    Read ICIVR until it is 0.
    7.Take i2c controller out of reset 把复位关掉,即开启I2C
    set IRS=1 in ICMDR

    下面直接上程序进行讲解

    //I2C访问EEPROM
    //时间:2020.12.31
    #include "F28x_Project.h"	//官方头文件
    #include "SciStdio.h"			//串口头文件
    
    // 宏定义
    #define I2C_SLAVE_ADDR        0x50	
    #define I2C_NUMBYTES          1
    #define I2C_EEPROM_REG00        0x01
    #define I2C_EEPROM_REG01        0x02
    
    // 全局变量
    struct I2CMSG I2cMsgOut1 =
    {
        I2C_MSGSTAT_SEND_WITHSTOP,
        I2C_SLAVE_ADDR,
        I2C_NUMBYTES,
        0x00,                   // N/A
        I2C_EEPROM_REG00,         // 地址低位
                                 //Uint16 MsgBuffer[I2C_MAX_BUFFER_SIZE];
    };
    
    struct I2CMSG I2cMsgIn1 =
    {
        I2C_MSGSTAT_SEND_NOSTOP,
        I2C_SLAVE_ADDR,
        I2C_NUMBYTES,
        0x00,                   // N/A
        I2C_EEPROM_REG00,         // 地址低位
    };
    
    // I2C 初始化
    void I2CA_Init(void)
    {
       I2caRegs.I2CSAR.all = I2C_SLAVE_ADDR;     // 从设备地址
    
       I2caRegs.I2CPSC.all = 6;                  // 分频 需要 7-12 Mhz 模块时钟
       I2caRegs.I2CCLKL = 10;                    // 非零值
       I2caRegs.I2CCLKH = 5;                     // 非零值
       I2caRegs.I2CMDR.all = 0x0020;             // 解除复位 挂起时停止 I2C
    
       return;
    }
    
    
    Uint16 I2CA_WriteData(struct I2CMSG *msg)       // I2C 写数据
    {
        I2caRegs.I2CSAR.all = msg->SlaveAddress;     // 设置从设备地址
        I2caRegs.I2CCNT = msg->NumOfBytes + 1;       // 设置要发送的字节数目
        I2caRegs.I2CDXR.all = msg->MemoryLowAddr;    // 设置寄存器地址
        I2caRegs.I2CMDR.all = 0x6E20;                // 配置 I2C 发送模式——FREE、STT、STP、MST、TRX、IRS
    
        int i;    // 开始发送数据
        for( i= 0; i < msg->NumOfBytes; i++)
        {
            while(!I2caRegs.I2CSTR.bit.XRDY);       //Transmit-data-ready interrupt flag bit.发送数据就绪中断标志位。(I2CDXR)准备好接受新数据
            I2caRegs.I2CDXR.all = *(msg->MsgBuffer + i);
        }
        while(I2caRegs.I2CSTR.bit.BB);    // 忙检测
    
        return I2C_SUCCESS;
    }
    
    
    Uint16 I2CA_ReadData(struct I2CMSG *msg)        // I2C 读数据
    {
        I2caRegs.I2CSAR.all = msg->SlaveAddress;    // 设置从设备地址
        I2caRegs.I2CCNT = 1;                        // 设备地址长度
        I2caRegs.I2CDXR.all = msg->MemoryLowAddr;   // 寄存器地址
        I2caRegs.I2CMDR.all = 0x2620;               // 配置 I2C 发送    STT、MST、TRX、IRS
        DELAY_US(500);
        I2caRegs.I2CCNT = msg->NumOfBytes;          // 接收数据大小
        I2caRegs.I2CMDR.all = 0x2C20;                // 配置 I2C 接收  STT、STP、MST、Receiver mode、IRS
    
        int i;    //开始接收数据
        for(i = 0; i < msg->NumOfBytes; i++)
        {
            while(!I2caRegs.I2CSTR.bit.RRDY);
            *(msg->MsgBuffer + i) = I2caRegs.I2CDRR.all;
        }
    
       return I2C_SUCCESS;
    }
    
    void main(void)
    {
        // 初始化系统控制 锁相环 看门狗 外设
        InitSysCtrl();
    
        // 初始化 GPIO
        InitGpio();
    
        GPIO_SetupPinMux(32, GPIO_MUX_CPU1, 1);
        GPIO_SetupPinMux(33, GPIO_MUX_CPU1, 1);
        EALLOW;
        GpioCtrlRegs.GPDMUX2.bit.GPIO115 = 0;   // led1
        GpioCtrlRegs.GPDDIR.bit.GPIO115 = 1;
        GpioCtrlRegs.GPDMUX2.bit.GPIO116 = 0;   // led2
        GpioCtrlRegs.GPDDIR.bit.GPIO116 = 1;
        GpioCtrlRegs.GPDMUX1.bit.GPIO111 = 0;   // led1
        GpioCtrlRegs.GPDDIR.bit.GPIO111 = 1;
        GpioCtrlRegs.GPDMUX2.bit.GPIO112 = 0;   // led2
        GpioCtrlRegs.GPDDIR.bit.GPIO112 = 1;
        GpioCtrlRegs.GPDMUX2.bit.GPIO113 = 0;   // led3
        GpioCtrlRegs.GPDDIR.bit.GPIO113 = 1;
        GpioCtrlRegs.GPDMUX2.bit.GPIO114 = 0;   // led4
        GpioCtrlRegs.GPDDIR.bit.GPIO114 = 1;
        EDIS;
        // 初始化串口
        SCIStdioInit();
        SCIPuts("\r\n ============Test Start===========.\r\n", -1);
        SCIPuts("Welcome to TL28377 I2C  Demo application.\r\n\r\n", -1);
    
        // 初始化外设
        I2CA_Init();
    
        // 清除接收缓冲区
        Uint16 i;
        for (i = 0; i < I2C_MAX_BUFFER_SIZE; i++)
        {
           I2cMsgIn1.MsgBuffer[i] = 0x0000;
        }
    
        for(;;)
        {
            if( I2CA_WriteData(&I2cMsgOut1) ==  I2C_SUCCESS )        // 写数据成功
            {
                SCIprintf("wwrite to EEPROM numbers:%x\n\r\n", *I2cMsgOut1.MsgBuffer);
                I2cMsgOut1.MsgBuffer[0] += 1 ;
            }
            DELAY_US(5000000);
            if( I2CA_ReadData(&I2cMsgIn1) ==  I2C_SUCCESS )        // 读数据成功
            {
                GpioDataRegs.GPDTOGGLE.bit.GPIO116 = 1;
                SCIprintf("read from EEPROM numbers:%x\n\r\n", *I2cMsgIn1.MsgBuffer);
            }
    
        }
    }
    

    程序上注释都很清晰,下面我总结一下程序
    其实就是通过定义两个结构体(一个用于输入一个用于输出,注意:I2CMSG这个结构体在官方的I2C头文件中已经构造),然后配置I2C各种寄存器,再写写入和读出函数,然后直接把我们定义的结构体传给读或写的函数,最后在主程序调用就可以了。

    展开全文
  •  对于LQF48封装而言,调试分别为:  29脚:SWCLK;  39脚:SWDIO;      这个两个引脚可以复用,在项目设计中到了29脚,将该引脚用作了GPIO输出脚,在用库函数调试的...
  • 51单片机的IO口驱动能力、灌电流、拉电流、上拉电阻的选择
  • 关于IO口模拟SPI

    千次阅读 2008-11-04 11:20:00
    关于IO口模拟SPI 最近有朋友问到IO口模拟SPI的问题,其实光模拟来说,就时序问题,读取和写入一个字节的时序。 首先选4个IO口,作模拟用,分别模拟CS、SCLK、SI、SO.即是片选、时钟、数据输入、数据输出。 IO口...

    关于IO口模拟SPI

     最近有朋友问到IO口模拟SPI的问题,其实光模拟来说,就时序问题,读取和写入一个字节的时序。

     首先选4个IO口,作模拟用,分别模拟CS、SCLK、SI、SO.即是片选、时钟、数据输入、数据输出。

      IO口初始化,分别把对应的IO口设置输入输出。CS、SCLK、SO、设置为输出,SI设置为输入。

      然后就是时序问题了,一般如下:

    //设要写的数据是abyte表示。 

    CS_1;              //片选高,
    SCLK_1;        //时钟高
    CS_0;              //片选低,开始工作。
    for(i=0;i<8;i++)//循环产生时钟,写入数据。

    {
    SCLK_0;          //时钟低,下降沿
    if(0x80&abyte)
    SO_1;        
    else
    SO_0;
    SCLK_1;
    abyte<<=1;
    }
    SCLK_0;
    CS_1;

     

    //设要读的数据是abyte表示。 

    CS_0;

    SCLK_1;

    for(i=0;i<8;i++)//读取数据值。
    {
    SCLK_0;
    ;;
    SCLK_1;
    abyte<<=1;
    if(in_SI)
    abyte++;
    }
    SCLK_0;
    CS_1;

    展开全文
  • dm642的IO口输出的电压信号频率多高?和cpu主频一样吗?现在测的IO口的输出电压为2.4v!
  • 一、RapidIO协议结构及包格式 为了满足灵活性和可扩展性的要求,RapidIO协议分为三层:逻辑层、传输层和物理层。下图说明了RapidIO协议的分层结构。 逻辑层定义了操作协议; 传输层定义了包交换、路由和寻址...

    一、RapidIO协议结构及包格式        
            为了满足灵活性和可扩展性的要求,RapidIO协议分为三层:逻辑层、传输层和物理层。下图说明了RapidIO协议的分层结构。

    逻辑层定义了操作协议; 传输层定义了包交换、路由和寻址机制;物理层定义了电气特性、链路控制和纠错重传等。
            像以太网一样,RapidIO也是基于包交换的互连技术。RapidIO包由包头、可选的载荷数据和16bits CRC校验组成。包头的长度因为包类型不同可能是十几到二十几个字节。每包的载荷数据长度不超过256字节,这有利于减少传输时延,简化硬件实现。

    二、逻辑层协议
            逻辑层定义了操作协议和相应的包格式。RapidIO支持的逻辑层业务主要是:直接IO/DMA (Direct IO/Direct Memory Access)和消息传递(Message Passing)。
            直接IO/DMA模式是最简单实用的传输方式,其前提是主设备知道被访问端的存储器映射。在这种模式下,主设备可以直接读写从设备的存储器。直接IO/DMA在被访问端的功能往往完全由硬件实现,所以被访问的器件不会有任何软件负担。从功能上讲,这一特点和德州仪器DSP的传统的主机接口(HPI, Host Port Interface)类似。但和HPI口相比,SRIO(Serial RapidIO)带宽大,管脚少,传输方式更灵活。
            对上层应用来说,发起直接IO/DMA传输主要需提供以下参数:目标器件ID、数据长度、数据在目标器件存储器中的地址。

            直接IO/DMA模式又可进一步分为以下几种传输格式:
            1、NWRITE: 写操作,不要求接收端响应。
            2、NWRITE_R: 带响应的NWRITE(NWRITE with Response),要求接收端响应。
            3、SWRITE:流写(Stream Write),数据长度必须是8字节的整数倍,不要求接收端响应。
            4、NREAD: 读操作。

            SWRITE是最高效的传输格式;带响应的写操作或读操作效率则较低,一般只能达到不带响应的传输的效率的一半。
            消息传递(Message Passing)模式则类似于以太网的传输方式,它不要求主设备知道被访问设备的存储器状况。数据在被访问设备中的位置则由邮箱号(类似于以太网协议中的端口号)确定。从设备根据接收到的包的邮箱号把数据保存到对应的缓冲区,这一过程往往无法完全由硬件实现,而需要软件协助,所以会带来一些软件负担。
            对上层应用来说,发起消息传递主要需提供以下参数:目标器件ID、数据长度、邮箱号。

            下表对直接IO/DMA和消息传递进行了对比:
                                                              直接IO/DMA         消息传递
            主机可直接访问从机存储器?              可以                  不可以
            主机需要知道从机存储器映射?           需要                  不需要
            数据寻址方式                                存储器地址             邮箱号
            支持的数据访问方式                          读/写                     写
            从机软件负担                                      无                       有

    三、传输层协议
            RapidIO是基于包交换的互连技术,传输层定义了包交换的路由和寻址机制。
            RapidIO网络主要由两种器件,终端器件(End Point)和交换器件(Switch)组成。终端器件是数据包的源或目的地,不同的终端器件以器件ID来区分。RapidIO支持8 bits 或 16 bits器件ID,因此一个RapidIO网络最多可容纳256或65536个终端器件。与以太网类似,RapidIO也支持广播或组播,每个终端器件除了独有的器件ID外,还可配置广播或组播ID。交换器件根据包的目标器件ID进行包的转发,交换器件本身没有器件ID。
            RapidIO的互连拓扑结构非常灵活,除了通过交换器件外,两个终端器件也可直接互连。

    四、物理层协议
            RapidIO 1.x 协议定义了以下两种物理层接口标准:
            1、8/16 并行LVDS协议
            2、1x/4x 串行协议 (SRIO)

            并行RapidIO由于信号线较多(40~76)难以得到广泛的应用,而1x/4x串行RapidIO仅4或16个信号线,逐渐成为主流,所以本文仅介绍串行RapidIO。
            串行RapidIO基于现在已广泛用于背板互连的SerDes(Serialize Deserialize)技术,它采用差分交流耦合信号。差分交流耦合信号具有抗干扰强、速率高、传输距离较远等优点。
            为了支持全双工传输,串行RapidIO收发信号是独立的,所以每一个串行RapidIO口由4根信号线组成。标准的1x/4x 串行RapidIO接口,支持四个口,共16根信号线。这四个口可被用作独立的接口传输不同的数据;也可合并在一起当作一个接口使用,以提高单一接口的吞吐量。
             DSP6678上集成了标准的1x/4x串行RapidIO接口,如下图所示。

    发送时,逻辑层和传输层将组好的包经过CRC编码后被送到物理层的FIFO中,“8b/10b编码”模块将每8bit数据编码成10bits数据,“并/串转换”模块将10bits并行数据转换成串行bits,发送模块把数字bit转换成差分交流耦合信号在信号线上发送出去。这里的8b/10编码的主要作用是:
            1、保证信号有足够的跳变,以便于接收方恢复时钟。串行RapidIO没有专门的时钟信号线,接收端靠数据信号的跳变恢复时钟。所以需要把信号跳变少的8bits数据(如全0或全1)编码成有一定跳变的10bits数据。另外,也使得总体数据中0和1的个数均衡,以消除直流分量,保证交流耦合特性;
            2、8b/10编码可扩大符号空间,以承载带内控制符号。10bits能表示1024个符号,其中256个表示有效的8bits数据,剩下的符号中的几十个被用作控制符号。控制符号可被用作包分隔符,响应标志,或用于链路初始化,链路控制等功能;
            3、8b/10编码能实现一定的检错功能。1024个符号中,除了256个有效数据符号和几十个控制符号外,其它符号都是非法的,接收方收到非法符号则表示链路传输出错。

            接收的过程则正好相反,首先接收方需要根据数据信号的跳变恢复时钟,用这个时钟采样串行信号,将串行信号转换为10bits的并行信号,再按8b/10b编码规则解码得到8bits数据,最后做CRC校验并送上层处理。
            数据被正确的接收时,接收端会发送一个ACK响应包给发送端;如果数据不正确(CRC错或非法的10bits符号),则会送NACK包,要求发送方重传。这种重传纠错的功能由物理层完成,而物理层功能往往由硬件实现,所以不需要软件干预。

            本文参考http://www.ti.com.cn/general/cn/docs/gencontent.tsp?contentId=50741

    展开全文
  • 配置寄存器IO口的步骤

    千次阅读 2017-11-18 17:34:12
    以下来自正点原子教程 ----------------------...配置寄存器IO口的步骤 ①初始化HAL库:HAL_Init(); ②初始化系统时钟  STM32F429:Stm32_Clock_Init(360,25,2,8);  STM32F767: Stm32_Clock_Init(432,25,2,9); ③

    以下来自正点原子教程

    ----------------------------------------

    配置寄存器IO口的步骤

    初始化 HAL 库: HAL_Init ();
    初始化系统时钟

          STM32F429Stm32_Clock_Init(360,25,2,8);

          STM32F767 Stm32_Clock_Init(432,25,2,9);

    ③   使能IO口时钟。配置IO口时钟使能寄存器:RCC->AHB1ENR

    ④   初始化IO口模式。配置四个配置寄存器

           GPIOx_MODER            GPIOx_OTYPER

           GPIOx_OSPEEDR         GPIOx_PUPDR

      操作IO口,输出高低电平。

          配置寄存器GPIOX_ODR或者GPIOx_BSRR

    展开全文
  • 排版整理:晓宇转自:芯片之家在做项目(工程)的时候,我们经常要用到比较多的按键,而且IO资源紧张,于是我们就想方设法地在别的模块中节省IO口,好不容易挤出一两个IO口,却发现仍然不够用,...
  • 2812的IO口控制--LED点亮

    千次阅读 2011-06-18 23:43:00
    复用控制寄存器 --- GPxMUX  (0---数字IO,1---专用外设功能)方向控制寄存器 --- GPxDIR  (0---输入,1---输出)量化控制寄存器 --- GPxQUAL (0---无量化,1---量化范围0x00--0xff)I/O数据寄存器 --- G
  • DSP28335 GPIO配置概述

    千次阅读 2017-07-28 22:03:55
    DSP28355 GPIO配置 步骤
  •  答:在IC的资料里都有说明I/O的驱动能力,根据你的负载所需要的驱动能力来判断这个IC的I/O是否符合,如果符合可以用 三极管或者MOS管放大提高驱动能力。  4、举个例子:用一个IC驱动led。IC输出电压5V,...
  • 这里的存储器图不涉及插入等待周期。 IO设备的图可以自行减去插入等待周期,然后观察。 存储器读读写 存储器写写读 I/O设备读写操作
  • https://blog.csdn.net/qq_34471646/article/details/81269708
  • DSP28335的GPIO功能应用

    千次阅读 2020-02-20 12:25:56
    DSP28335中,一共有88个GPIO,分为3组,A组GPIO0-GPIO31;B组GPIO32-63;C组GPIO64-GPIO87。这些引脚的首要功能就是输入/输出功能,其次就是片内外设功能。具体工作在哪种功能由功能配置寄存器GPxMUX1/2(x为A、B...
  • 串行 RapidIO: 高性能嵌入式互连技术 作者: 德州仪器技术应用工程师 冯华亮/ Brighton Feng/ bf@ti.com 摘要 串行RapidIO针对高性能嵌入式系统芯片间和板间互连而设计,它将是未来十几年中嵌入式系统互连的...
  • SPI比较混乱,主要是没有标准的协议,只有moto的事实标准。所以衍生出多个版本,但没有本质的差异。 标准的SPI协议有: 4线:SCLK MOSI MISO CS 3线:SCLK SDA CS 但还有一个常见的版本,也是我们常用的,只有输出...
  • DSP2812用GPIO模拟I2C协议对AT24C01存储芯片进行读写控制
  • DSP的AD的采样

    千次阅读 2010-12-07 14:45:00
    今天子在研发的过程中,发现我的一起明明有回波,但是在AD采样的时候,却采样不到数据,我在用仿真器仿真的时候也发现是有数据的,就是DSP的AD采样不到数据,开始我以为是采样回波的AD坏了,换了一个还是...
  • 就是将一组IO口接到锁存器的输入,另一组IO口接到其输出。这样的话,我可以利用第一组IO输出几个值,用第二组IO接收这几个值,然后加以比较,有出入的话,就能够确定是哪个部分的IO口有问题了。 但是我之前很少接触...
  • 最大可以输出8mA,灌入20mA,但要保证所有进入芯片VDD的电流不能超过150mA,同样所有从VSS流出的电流也不能超过150mA。详细请看STM32的数据手册中的相关内容。例如,STM32F103中容量产品,需要看5.2节和... STM32F1...
  • DSP学习总结——GPIO操作

    千次阅读 2014-10-04 21:09:08
    GPIO,通用IO口操作,在51、ARM里比较shux
  • DSP28335模拟IIC

    2015-10-17 19:47:22
    DSP28335用IO口迷你IIC,包含加速度传感器,陀螺仪,地磁传感器。
  • F28335有三种32位的I/O口,依次PORTA(GPIO0-GPIO31), PORTB(GPIO32-GPIO63), PORTC(GPIO64-GPIO87),这些口都可以配置为普通的数字IO口同样也能被配置为外部接口。这样涉及到了IO的寄存器,IO口共有三类寄存器:...
  • DSP

    2014-09-09 17:25:00
    献给初学者-DSP入门教程 2008-03-25 09:51:53|分类:DSP学习资料|举报|字号订阅 献给初学者-DSP入门教程 helloDSP论坛 前言:此资料也是来源于网络,并不是我们原创,但是希望这些资料能够给初学DSP...
  • C5509A这款DSP的通用IO口实在是少的可怜,比起一般的ARM来实在不够用, 一般采用CPLD的方法进行IO扣拓展,如果不采用CPLD的,也可以用尽其IO 首先它有7个通用的IO口,但是0,1,2,3是不能用的,这四个IO是做 上电...
  • 基于BF531 DSP的可编程标志

    千次阅读 2012-02-22 13:16:54
     可编程标志即所谓的通用目的I/O,这是CPU的最基本的外设,嵌入式系统中,任何一个CPU都会有通用目的I/O,他们的属性都基本上相似,只是叫法不一样而已。  ADSP-BF531/2/3处理器有16个双向
  • 本文介绍一种用单片机普通I/O 实现串行通信的方法,可在单片机的最小应用系统中实现与两个以上串行接口设备的多机通信。  1.串行接口的基本通信方式  串行接口的有异步和同步两种基本通信方式。异步通信采用...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,488
精华内容 995
关键字:

dspio口