搜索
bottom↓
回复: 5

在51单片机上写外围设备的驱动有必要么?

[复制链接]

出0入0汤圆

发表于 2014-9-3 17:59:54 | 显示全部楼层 |阅读模式
打算给C8051F040的一些外围器件(ADC, SMBUS, UART,...)写驱动并提供统一的数据传输接口(并向上封装到能给外围器件分配虚拟寻址地址的层次),但是这大大增加了ISR的执行时间和接口函数的额外空间。
想知道各位大大是如何考虑的。

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2014-9-4 07:21:54 | 显示全部楼层
这个应该看系统的大小和实际需求吧。单片机本来就是精简。

出0入0汤圆

发表于 2014-9-4 07:32:41 | 显示全部楼层
出于锻炼自己编程能力的角度考虑是挺好的。

出0入0汤圆

发表于 2014-9-4 10:32:38 | 显示全部楼层
支持一下来,新人

出0入0汤圆

发表于 2014-9-4 10:40:14 | 显示全部楼层
取决于你要做什么,你以都用这个系列的芯片还是就是练习,或者你想造福后人?
做外围驱动很锻炼模块化设计,还有时序的控制。所以看你的需求了

出0入0汤圆

 楼主| 发表于 2014-9-4 12:21:58 | 显示全部楼层
severewinner 发表于 2014-9-4 10:40
取决于你要做什么,你以都用这个系列的芯片还是就是练习,或者你想造福后人?
做外围驱动很锻炼模块化设计 ...

看起来还是练习的成分多一点。。
那就当作多了解下这方面的知识,再请大大帮看下代码。。
UART
  1. #include "uart.h"

  2. unsigned char idata UART0_Stat;//BUSY:1
  3. unsigned char idata UART0_DevAdd;
  4. unsigned char xdata* idata UART0_TxCache;
  5. unsigned char idata UART0_TxLen;
  6. unsigned char xdata* idata UART0_RxCache;
  7. unsigned char idata UART0_RxLen;
  8. /*
  9. TransmissionCache:
  10.         if Multiprocessor Communications
  11.                 the UART0_DevAdd is the Target Address
  12.         or it would be blank
  13.         UART0_TxCache is the data pointer
  14.         UART0_RxLen is the data's length
  15. ReceptionCache:
  16.        
  17. */
  18. Status UART0_O(unsigned char DevAdd, unsigned char xdata* TxCache, unsigned char TxLen){
  19.         if( UART0_Stat & UART0_Busy ) return 0; //Fail|Buf_full;
  20.         SFRPAGE_SAVED = SFRPAGE;
  21.         SFRPAGE = UART0_PAGE;
  22.         UART0_Stat |= UART0_Busy;
  23.         UART0_DevAdd = DevAdd;
  24.         UART0_TxCache = TxCache;
  25.         UART0_TxLen = TxLen;
  26.         SBUF0 = *UART0_TxCache++;
  27.         UART0_TxLen--;
  28.         SFRPAGE = SFRPAGE_SAVED;
  29.         return 1; //complete|sending;
  30. }

  31. void UART0_Interrupt(void) interrupt 4 {
  32.        
  33.         if ( RI0 == 1 ){
  34.                 RI0 = 0;
  35.                 *UART0_RxCache++ = SBUF0;//*UART0_RxCache point to the next position of a string's tail
  36.                 UART0_RxLen++;
  37.         }
  38.         if( TI0 == 1 ){
  39.                 TI0 = 0;
  40.                 if( UART0_TxLen != 0 ){
  41.                         SBUF0 = *UART0_TxCache++;
  42.                         UART0_TxLen--;
  43.                         }else{
  44.                         UART0_Stat &= ~UART0_Busy;
  45.                 }
  46.         }
  47.         return ;
  48. }
复制代码

一个简单的UART驱动,和一个相对复杂的SMBUS驱动
  1. #include "smbus.h"
  2. #include "gernic.h"

  3. unsigned char idata SMBUS0_Stat;//BUSY:1 RnW:1
  4. unsigned char idata SMBUS0_DevAdd;
  5. unsigned char xdata* idata SMBUS0_AddCache;
  6. unsigned char idata SMBUS0_AddLen;
  7. unsigned char xdata* idata SMBUS0_TxRxCache;
  8. unsigned char idata SMBUS0_TxRxLen;

  9. Status SMBUS0_IO(uint8 DevAdd, unsigned char xdata *AddCache, unsigned char xdata *TxRxCache, uint8 AddLen, uint8 TxRxLen){
  10.         if( SMBUS0_Stat & SMBUS0_Busy ) return 0; //Fail|Buf_full;
  11.         SMBUS0_Stat |= SMBUS0_Busy;//置位忙
  12.         if( (DevAdd & 0x01) == READ){
  13.                 SMBUS0_Stat |= READ;
  14.         }else{
  15.                 SMBUS0_Stat |= WRITE;
  16.         }       
  17.         SMBUS0_DevAdd = DevAdd & 0xFE;//放入目标地址和写操作
  18.         SMBUS0_AddCache = AddCache;//放入目标数据位置
  19.         SMBUS0_TxRxCache = TxRxCache;//放入数据地址
  20.         SMBUS0_AddLen = AddLen;//放入地址长度
  21.         SMBUS0_TxRxLen = TxRxLen;//放入数据长度
  22.         SFRPAGE_SAVED = SFRPAGE;//开始发送
  23.         SFRPAGE = SMB0_PAGE;
  24.         STA = 1;
  25.         SFRPAGE = SFRPAGE_SAVED;
  26.         return 1; //complete|sending;
  27. }

  28. void SMBUS0_ISR (void) interrupt 7 {

  29.         SI = 0;
  30.         switch( SMB0STA ){
  31.                 case SMB_MSTART ://发送了开始位 ok
  32.                 case SMB_MRPSTART ://发送了重新开始位 ok
  33.                         SMB0DAT = SMBUS0_DevAdd; //发送目标地址
  34.                         STA = 0;//清零STA
  35.                         break;
  36.                 case SMB_MTADDACK : //发送目标地址收到ACK
  37.                 case SMB_MTDBACK : //发送数据收到ACK
  38.                         if( SMBUS0_AddLen != 0 ){//要发送地址
  39.                                 SMB0DAT = *SMBUS0_AddCache++;
  40.                                 SMBUS0_AddLen--;
  41.                                 break;
  42.                         }
  43.                         if( (SMBUS0_Stat & READ) == READ ){
  44.                                 SMBUS0_Stat |= READ;
  45.                                 STA = 1;//发送重复开始
  46.                                 break;
  47.                         }
  48.                         if( SMBUS0_TxRxLen != 0 ){//要发送的数据
  49.                                 SMB0DAT = *SMBUS0_TxRxCache++;
  50.                                 SMBUS0_TxRxLen--;
  51.                                 break;
  52.                         }
  53.                         STO = 1;//结束传输
  54.                         SMBUS0_Stat &= ~SMBUS_BUSY;//SMBUS闲
  55.                         break;
  56.                 case SMB_MRDBACK :                       
  57.                         *SMBUS0_TxRxCache++ = SMB0DAT;
  58.                 case SMB_MRADDACK :
  59.                         if( --SMBUS0_TxRxLen != 0 ){ //接收完毕?
  60.                                 AA = 1;
  61.                         }else{
  62.                                 AA = 0;
  63.                         }
  64.                         break;
  65.                 case SMB_MRDBNACK :
  66.                         *SMBUS0_TxRxCache = SMB0DAT;
  67.                         STO = 1;
  68.                         SMBUS0_Stat &= ~SMBUS0_Busy;
  69.                         break;
  70.                 default:
  71.                         SMB0CN &= ~0x74;                 //重设
  72.                         SMB0CN |= 0x40;
  73.         }

  74.         return ;
  75. }
复制代码

是否用汇编写,接口用Blocking还是Non-Blocking,可以精简信号传递么,在这些方面尚有疑问。
简而言之就是还是想找明灯讨个最优化设计的大概信息,就练习模块化设计而言。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 10:32

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表