电子说
介绍
客户在初次使用e2 studio开发程序的时候不知道如何使用IDE,本文以RA6T2为例子,详细地介绍了在一个新建的程序中,通过配置实现IIC对eeprom的读写。
在e2 studio中新建一个程序,点击configuration.xml文件打开配置界面。
设置IIC模块的时钟源,在IIC通信的时候用来给SCL提供时钟信号。打开文档查看PLL时钟的寄存器配置,PLL一共需要配置三个参数,分别是输入锁相环分频系数、时钟源、PLL倍频因子。
点击Clocks配置时钟,这里使用了PLL倍频时钟,PLL倍频时钟可以选择主时钟或者内部高速振荡器作为时钟源,这里选用内部高速振荡器HOCO作为PLL倍频时钟源。
HOCO时钟为20M,PLL Div/2锁相环输入分频将时钟降为10M,PLL Mul x24.0倍频因子将时钟倍频为240M。配置IIC时钟源IICCLK Src,选择PLL作为时钟源,IICCLK Div/2输入分频将时钟降为120MHZ,IIC的时钟源则为120MHz。(要注意的是RA6T2的IIC时钟源要配置到60MHz以上)
点击pins,配置IIC的pin引脚,RA6T2有两路IIC,分别是IIC0和IIC1,在Connectivity:IIC中可以配置相应的IIC引脚,这里选择的是IIC0配置。
RA6T2的IIC0一共可以选择5组IIC引脚(A~E),下图Pin Group Selection选择的是_B only,将操作模式Operation Mode设置为Enabled,使能B组IIC的引脚配置,这时候IIC对应的SCL0对应的引脚为PC10,SDA0对应的引脚为PC11。每一组IIC的引脚都是固定的,引脚编号也不一样,如果选择_A only,SCL0对应的引脚为PB06,SDA0对应的引脚为PB07。
点击右边的设置按钮,并点击FSP Visualization 可以打开芯片的图形界面,在点击IIC0,在芯片的图形界面上就会显示出IIC0的B组引脚PC10和PC11在芯片中的位置。也可以点击芯片图形界面上的引脚配置相应的引脚功能。
点击Stacks,会出现下图所示的配置驱动代码的界面,e2 studio会根据用户的配置,自动生成相应驱动代码。点击New Stack新建一个Stack,在New Stack里面选择Connectivity配置通信类的驱动代码,在Connectivity的下一级目录中点击I2C Master(r_iic_b_master),生成IIC Master的驱动,在RA6T2中一个共有5种IIC类型可以选,这里使用IIC作为主机模式使用所以选择r_iic_b_master,r_iic_b_slave是将IIC设置成从机模式,r_sci_b_master是将通用串行接口SCI设置成简易IIC主机模式,其他两个是作为从机模式使用。
点击图片上右上角红框框出来的设置和g_i2c_master0 I2C Master(r_iic_b_master),再点击属性界面,就可以调出IIC的配置界面。
Name是设置IIC模块的名称;Channel选IIC的0通道;Rate IIC的传输速度设置为标准模式;Rise Time上升沿时间为120ns(默认值);Fall time下降沿时间为120ns(默认值);Duty Cycle时钟计数周期为50(默认值);Slave Address从设备地址为0x50;Address Mode 7-Bit表示设备地址为7位;Timeout Mode IIC通信超时时间设置为短时间模式;Timeout during SCL Low Enable超时的时候SCL时钟线为低电平;Callback设置回调函数名;Interrupt Priority Level中断等级设置为12级;SCL0选择IIC时钟引脚;SDA0选择IIC数据引脚。
DTC全称叫Data Transfer Controller(数据传送控制器),功能与DMA类似,点击Stacks,打开驱动配置界面,在配置好的g_i2c_master0 I2C Master(r_iic_b_master)模块下有两个小模块,分别是Add DTC Driver for Transmission[Optional]增加IIC的发送DTC功能,Add DTC Driver for Reception[Optional]增加IIC的接收DTC功能。左键点击Add DTC Driver for Transmission[Optional],弹出new->Transfer(r_dtc),左键点击Transfer(r_dtc)生成DTC配置文件。
在IIC的属性配置中,将DTC on Transmission and Reception设置成Enabled。
点击下图红框框出来的地方,可以查看和设置配置信息。g_transfer0是DTC模块名称;Normal表示使用正常模式;传输大小为1 Byte;目的地址固定;源地址递增;在发送完成后产生中断;以IIC的发送寄存器为空作为DTC的触发源。
左键点击红框内的Generate Project Content将配置好的信息生成相应的驱动代码。
下图是经过属性配置后自动生成的IIC初始化代码,这个函数在工程目录下的ra->fsp->src->r_iic_b_master-> r_iic_b_master.c文件里面,函数调用方法如下:
fsp_err_t err;
err = R_IIC_B_MASTER_Open (&g_i2c_master0_ctrl, &g_i2c_master0_cfg);
R_IIC_B_MASTER_Open函数有一个fsp_err_t类型的返回值,如果函数调用成功,则会返回FSP_SUCCESS,否则返回其他错误提示。
函数里面需要传入两个参数,这个两个参数是在配置IIC的时候系统自动生成的,参数在工程目录下的ra_gen->hal_data.c文件里面。
g_i2c_master0_ctrl是用来记录IIC的状态信息,g_i2c_master0_cfg用来保存IIC的配置信息。
如果配置了DTC功能,在R_IIC_B_MASTER_Open函数里面会根据配置信息,选择以DTC的模式来通信。
在初始化IIC完成后,就可以使用IIC主设备与其他的IIC从设备进行通信。例如下图使用RA6T2的IIC主模式往eeprom里面写入数据。
代码向eeprom里面写入64字节的数据,IIC一共要发送67字节的数据,其中第一个字节是发送eeprom的设备地址,在R_IIC_B_MASTER_Write函数中已经写入IIC的设备地址了(配置IIC的时候填入的),所以还要再发送66个字节的数据;第二个和第三个数据是eeprom的存储地址;第4到第67是需要发送的数据,一共是64字节,代码上发送的是0~63的uint8_t类型的数据。
R_IIC_B_MASTER_Write是IIC主设备向从设备发送数据的函数,其中g_i2c_master0_ctrl是用来记录IIC的状态信息,在ra_gen->hal_data.c文件里面有声明;write_buffer是要发送的eeprom存储地址和数据;write_buffer_count表示要发送66字节的数据(不算设备地址);false表示发送完成后结束通信。最后要注意的是,要等待IIC发送数据完成、给一个延迟(eeprom写入数据完成后通常需要一个短暂的延迟后才能进行下一步操作)。
另外,使用RA6T2的IIC主模式往eeprom里面读取数据的操作如下图所示。
代码向eeprom里面读取64字节的数据。read_buffer_ID是为2个字节,这两个字节对应的是需要读取的eeprom数据的存储位置;read_buffer 是一个uint8_t类型的数组,用来存储从eeprom读取出来的64字节的数据;read_buffer_count表示要从eeprom里面读取64个字节的数据。
想要读取eeprom里面的数据,要先通过IIC发送设备地址,以及需要读取的eeprom存储地址,下图代码通过R_IIC_B_MASTER_Write函数向IIC发送了设备地址和read_buffer_ID(2个字节的eeprom存储地址),这时候通信还没有结束,所以R_IIC_B_MASTER_Write函数的最后一个参数填的是ture,继续进行通信,validate_i2c_event函数是等待eeprom应答,当eeprom应答后,再通过R_IIC_B_MASTER_Read函数读取数据,从R_IIC_B_MASTER_Write函数写入的地址开始计算,递增读取eeprom里面的数据,一个64字节的数据。
结论
通过上面的设置实现了RA6T2的IIC使用DTC读写eeprom。
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !