cat24wc02 驱动程序演示实验
一.实验目的
本程序展示了如何编写基于small rtos 的i2c 总线驱动程序。
二.实验设备及器件
pc 机 一台
dp-51proc 单片机综合仿真实验仪 一台
三.实验步骤
1. 使用导线连接d5 区的scl、sda 和a2 区的p16、p17(scl~p16、sda~p17),
短接d5 区的jp1 跳线;
2. 下载cat24wc02.hex 文件到dp-51proc 中并运行;
3. 打开dpflash.exe 软件的串口调试窗口(或者其他的串口调试软件),设置波特率
为4800 b/s 8 位数据 1 位停止位 和hex 方式显示数据,输入数据并按16 进
制方式发送。
四.实验参考程序主要部分
/***************************************************************
** small rtos(51)
** the real-time kernel(for keil c51)
** (c) copyright 2002-2004
** all rights reserved
** v1.20
*************************************************************/
#include config.h
uint8 showcase[8]; //显示缓存,用来保存各个显示位的段码
//指针的null 为0,这个变量占用0 地质避免出现有效的null 指针
uint8 os_q_mem_sel notuse _at_ 0x0000;
uint8 os_q_mem_sel serialindata[10]; //给读串口消息队列分配的队列空间
uint8 os_q_mem_sel serialoutdata[10]; //给写串口消息队列分配的队列空间
bit serialcansend = 1; // 正在发送标志,0:正在发送
uint8 eeprombuf[5]; //读写串行eeprom 数据的缓存
void putchar(uint8 data); //发送一个字节
void send(uint8 data); //发送一个数据
void serialinit(void);
void command(void);
void display(void);
void timesum(void);
/***************************************************
** 函数名称: init
** 功能描述: 初始化函数,一般在多任务环境启动前调用
*****************************************************/
void init(void)
{
tmod = (tmod & 0xf0) | 0x01;
th0 = (65536 - (11059200 / 12) / 100) / 256;
tl0 = (65536 - (11059200 / 12) / 100) % 256;
tr0 = 1;
et0 = 1;
tf0 = 0;
}
/******************************************************************
** 函数名称: main
** 功能描述: 主函数,用户程序从这里执行
****************************************************************/
void main(void)
{
osinit();
init();
ostaskcreate(command,null,0);
ostaskcreate(display,null,1);
ostaskcreate(timesum,null,2);
while(1)
{
pcon = pcon | 0x01; /* cpu 进入休眠状态 */
}
}
/****************************************************************
**显示任务
*************************************************************/
void display(void)
{
while(1)
{
showcase[3] = 31;
showcase[4] = 31;
showcase[5] = 31;
showcase[6] = 31;
zlg7290_sendbuf(showcase,8);
oswait(k_tmo,1);
}
}
/*****************************************************
** 函数名称: command
** 功能描述: 命令处理任务,高层命令由这个任务执行,相当于应用程序
***********************************************************/
void command(void)
{
uint8 data temp;
ossemcreate(iicsem,1);
ossemcreate(cat24wcxxsem,1);
osqcreate(serialindata,10);
osqcreate(serialoutdata,10);
serialinit();
while (1)
{
osqpend(&temp,serialindata,0);
/* 把接收到的数据在led 数码显示器上显示出来 */
showcase[0] = temp % 10;
showcase[1] = (temp / 10) % 10;
showcase[2] = temp / 100;
/* 把接收到的数据写入cat24wc02 */
eeprombuf[0] = 0; //外部地址
eeprombuf[1] = 1; //写多少字节
eeprombuf[2] = 0; //开始写地址
eeprombuf[3] = temp; //数据
oscat24wcxxwrite(eeprombuf);
oswait(k_tmo,10);
/* 从cat24wc02 读出刚才写入的数据*/
eeprombuf[0] = 0; //器件外部地址
eeprombuf[1] = 1; //读多少字节
eeprombuf[2] = 0; //开始读地址
oscat24wcxxread(eeprombuf);
/* 把读出的数据发送回去 */
send(eeprombuf[0]);
oswait(k_tmo,10);
}
}
/*****************************************************************
******
** 函数名称: serialinit
** 功能描述: 初始化串行口
****************************************************************
******/
void serialinit(void)
{
scon = 0x50;
pcon = 0x80;
tmod = tmod & 0x0f;
tmod = tmod | 0x20;
th1 = 0xf4; //波特率为 4800 b/s
tl1 = 0xf4;
tr1 = 1;
es = 1;
}
/***********************************************************
*******
** 函数名称: send
** 功能描述: 发送一个数据包
** 输 入: data:指向要发送的数据指针
*******************************************************
*******/
void send(uint8 data)
{
putchar(data);
}
/*******************************************************************
******
** 函数名称: putchar
** 功能描述: 发送一个字节
******************************************************************
********/
void putchar(uint8 data)
{
os_enter_critical();
if (serialcansend == 1)
{
serialcansend = 0;
sbuf = data;
}
else
{
osqintpost(serialoutdata,data);
}
os_exit_critical();
}
/*****************************************************************
** 函数名称: comm
** 功能描述: 串口中断处理程序
**************************************************************/
#pragma disable /* 除非最高优先级中断,否则,必须加上这一句 */
void comm(void) interrupt 4
{
uint8 data temp;
if (ri == 1)
{
os_int_enter();
ri = 0;
osqpost(serialindata,sbuf);
osintexit();
return;
}
if (ti == 1)
{
ti = 0;
if (osqaccept(&temp,serialoutdata) == os_q_ok)
{
sbuf = temp;
}
else
{
serialcansend = 1;
}
}
}
/*************************************************************
** 函数名称: timesum
** 功能描述: 使led 显示0~9 的任务
**************************************************************/
void timesum(void)
{
while (1)
{
showcase[7] ++;
if(showcase[7] > 9)
{
showcase[7] = 0;
}
oswait(k_tmo,os_ticks_per_sec); /* 延时1 秒 */
}
}
五.实验例程序简析
由于对i2c 总线驱动程序的操作具有不可重入性,故使用了信号量cat24wcxxsem 来
实现互斥操作,为了使用信号量,必须在os_cfg . h 文件中将en_os_sem 置为1。
以下为多任务对cat24wcxx 的写操作代码
#define oscat24wcxxwrite(a) \
if (ossempend(cat24wcxxsem,10) == os_sem_ok) \
{ \
cat24wcxxwrite (a); \
ossempost(cat24wcxxsem); \
}
以下为多任务对cat24wcxx 的读操作代码:
#define oscat24wcxxread(a) \
if (ossempend(cat24wcxxsem,10) == os_sem_ok) \
{ \
cat24wcxxread(a); \
ossempost(cat24wcxxsem); \
}
本程序中也使用的消息队列来缓冲数据,故也必须在os_cfg . h 文件中将en_os_q 置
为1,以使small rtos51 配置为允许使用消息队列。
从串口接收到的数据按10 进制的方式在led 上显示出来。最左边的led 循环的显示
0~9 用于表示系统正在运行之中。
射频滤波元器件如何推动5G技术发展
地铁二维码改造是如何实现的呢?传统地铁闸机厂商又该如何抉择呢?
澳大利亚昆士兰州拟在2030年实现50%的可再生能源发电
MSO6104A安捷伦示波器自动模式无法工作维修
华为荣耀8,有的不止是颜值,销量评价47万+!华为最火手机
CAT24WC02驱动程序演示实验
日本京瓷宣布推出一款Enerezza住宅储能电池 基于全球首创的半固态电池架构
解析机器人科技发展观对社会研究论
谷歌在京招聘人工智能技术研发人才 欲重返中国
SPEIC(单端初级电感转换器)的设计资料
自动驾驶和无人驾驶到底是不是一个概念?
物联网行业动态:纵行科技与工业巨头SCG成立合资公司,共拓东盟市场
如何在Linux使用iostat命令
Redmi 9系列新机曝光将搭载联发科Helio G70芯片
华为P10 Plus和iPhone 7 Plus对比评测:长期体验下谁更优质?
中国移动在5G领域的最新进展和布局
Litho发布AR视频创作应用,通过Litho指环来控制仅支持iOS系统
优必选科技参与成立“人形机器人创新发展联合体”
Nginx如何和现有监控系统集成
高通旗舰芯片骁龙835亚洲发布 支持3200万像素摄像头