串口监控器通过01 05 指令 往FM33256 确定空间地址 写入数据 DSP与FM33256 用SPI 通讯
读取时间 需要把数据先放到临时缓冲区中去。
Mem是定义指向AccessTaskReg 结构体类型的指针。
联合体 ACCESS_TASK_REG 是联合体 。
该 联合体 的 主要 存放的 是标志
寄存器读写任务标志。
存储器读写任务标志
union UPDATA_TASK_REG updata ;
数据更新任务寄存器 联合体
主要存放的任务 是 读取时间任务, 写入时间任务 ,写入操作记录任务,
写入故障记录任务,写累计信息。清除运行记录,清除故障记录 读取故障记录任务,
写入故障记录任务。
struct TASK_DATA_REG reg_access //寄存器存取任务数据 地址和长度按字节计算
对寄存器进行操作的时候,8位数据 包括地址 ,数据长度,读取到第几个数的指针, 以及数据选择 是指令 还是数据
struct TASK_DATA_REG mem_access; //存储器存取任务数据 地址和长度按字计算
unsigned char my_status [LEN_STATUS_CACHE]; //状态寄存器 用于读取时间
7个字节的数据 用于读取时间
unsigned char my_setting[LEN_SETTING_CACHE]; //设置参数寄存器 用于设置时间
7个字节的数据 用于设定时间
Uint16 my_operate[LEN_COMMAND_CACHE]; //操作命令存储
Uint16 my_record[LEN_RECORD_CHCHE]; //一条记录读取
Uint16 recorder[LEN_RECORD_CHCHE]; //一条记录写入
unsigned char reg_cache[100]; //寄存器缓存 8位bit
在memupdate() 有需要执行的操作,置位操作的步骤 例如步骤A 步骤B 步骤C
步骤D 等等。
假设在某一次main()循环 是 步骤A
然后在memaccess() 中完成对FM33256 的SPI 时序操作,
上面的图是第一次循环, 又假设第二次进入循环 变成了读取时间任务的B步骤。
注意下图是B步骤
Uint16 my_settingdata[LEN_SETTINGDATA_CACHE]; //设置的参数数据类型为Uint16,上位机通讯媒介,不是非易失
数组是Uint16类型,长度是50个字
LEN_SETTINGDATA_CACHE 定义为 50
Uint16 my_statusdata[LEN_SETTINGDATA_CACHE]; //读取的数据类型是Uint16,上位机通讯媒介,不是非易失
LEN_SETTINGDATA_CACHE 定义为50
如何理解my_settingdata[LEN_SETTINGDATA_CACHE]是上位机通讯的媒介 ?
以用 01 04 指令 往 FRAM 地址空间 写 设置参数 为例
01 04 20 00 00 0A 00 01 00 02 00 03 00 04 00 05 00 06 00 07 00 08 00 09 00 0A
CRC校验码1 CRC校验码2
程序的执行过程如下
在SCIRXPROCESS ()程序 中 进入 01 04 分支
有起始地址 要设置的字的个数
注意在memupdata() 中需要将字的个数乘以2 变为字节数 。
注意:address length page 是形式参数 ,最后需要赋值给全部变量
Mem->mem_access.addr
Mem->mem_access.len
并且把SCIRXPROCESS()中接收到的字节数据 经过拼凑成整型数据
然后给前面定义的结构体AccessTaskReg 里面的成员 my_settingdata[i]
同时 把mem_data.updata.bit.WR_ERRREC=1; 的标志置为1。
注意 有了这个 mem_data.updata.bit.WR_ERRREC=1 这个标志 后面的步骤就是 进入 memupdate()中 使用的。
进入memupdata 的第一步 就是
把存储器更新的步骤的 mem->updata.bit.TASK_STEP=FLAG_STEP_K
下面的图很重要。
在memupdata() 中
将你从SCIRXPROCESS() 接收的字节帧 转存进入 缓存reg_cache 中去。
然后下一个关键的步骤 就是调用底层驱动程序
Mem->task.bit.MEM_TASK=MEM_TASK_WRITE ;
下面有一个关键区别:
mem->task.bit.MEM_TASK=MEM_TASK_WRITE 是在memacess() 中使用的
而且
mem->updata.bit.TASK_STEP=FLAG_STEP_K; 是在函数 memupdate()中使用。
mem->task.bit.MEM_TASK=MEM_TASK_WRITE 是在memacess() 中使用的
下面查看memacess() 中底层SPI 对FRAM 进行写操作 程序写法
Memaccess () 函数分为以下几个模块
第一个模块:
/*****************写寄存器驱动开始*******************************/
if(mem->task.bit.REG_TASK==MEM_TASK_WRITE)
{
}
/************* ***写寄存器驱动结束*******************************/
第二个模块:
/****************读寄存器驱动开始*****************************/
if(mem->task.bit.REG_TASK==MEM_TASK_READ)
{
}
/****************读寄存器驱动结束 ******************/
第三个模块
/******************写数据存储区开始****************************/
if(mem->task.bit.MEM_TASK==MEM_TASK_WRITE)
{
}
/**************写数据存储区结束************************/
第四个模块
/***************读数据存储区开始****************************/
if(mem->task.bit.MEM_TASK==MEM_TASK_READ)
{
}
/**************读数据存储区结束*******************************/
上面就是让你清楚mem->task.bit.MEM_TASK
与 mem->task.bit.REG_TASK 的区别
另外一个 需要你注意
Memaccess() 中 步骤的标志 使用的结构体里面的成员是
mem->task.bit.MEM_TASK=MEM_TASK_WRITE
而在memupdata() 中 步骤的标志 使用的结构体里面的成员是
mem->updata.bit.TASK_STEP=FLAG_STEP_K;
下面在重新叙述一下 写FRAM 某一个存储空间的 例子
再次总结一下 用01 04 指令写FRAM 地址空间的步骤
第一:
在scirxproces()中将接收到的数据 存放进入数组mem->my_settingdata[i]中,
同时置位 updata 的数据标志
mem_data.updata.bit.WR_ERRREC=1; //将接收到的数据写进FRAM中
第二:
进入了主循环中的memupdata()函数
然后进入memupdata() 函数的
主要是 mem->my_settingdata[] 的数据 给 reg_cache ;
上面的一步骤 :
已经将 标志
Mem->task.bit.mem_task=mem_task_write
有了上面的标志 接着就是 进入memaccess() 中去
Memaccess 中用到了以下几个形式参数
用于写寄存器时候的数据 的空间首地址 writeRegStartAddr 指针变量
用于读寄存器时候的数据 的空间首地址 ReadRegStartAddr 指针变量
用于写FRAM存储空间的数据空间的首地址 Write_Fram_StartAddr
用于读取FRAM存储空间的数据空间的首地址 Read_Fram_StartAddr
指向 全局变量 mem_data 的指针变量 mem
下面就是SPI写存储器操作的时序
首先将数据区mem->reg_cache[0]的缓冲区域的地址 赋值 给指针变量 Write_Frame_StartAddr
然后将地址的高字节 赋予给 FRAMAddrHigh
然后将地址的低字节 赋予给 FRAMAddrLOW
然后打开门闩
片选
SPI总线写入控制指令0X02
SPI总线写入存储器起始地址的高字节
SPI总线写入存储器起始地址的低字节
把mem->reg_cache[0]起始地址对应内存单元里的书 通过SPI总线发送出去。
写入完成以后
将MEMACCESS()中的标志置为 空闲
Mem->task.bit.MEM_task=MEM_TASK_IDLE ;
片选拉高
然后清空 SPI
至此 通过SCI串口给DSP28335发送数据并通过SPI上传到FM33256 存储器中的 记录 已经说清楚
接下来用图形再次描述一遍