3435|5

42

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

【TI首届低功耗设计大赛】空气参数记录仪(OLED调试阶段) [复制链接]

本帖最后由 GaryTavish 于 2014-12-21 15:49 编辑

       说来惭愧,一开始看到活动的通知就兴致勃勃的填写了申请,谁想到收到板子以后,生活里各种事情接踵而至,又是考试又是实习又是论文又是找工作,还有一堆人催着我做项目,真是分身乏术,好在工作的额事情已经落听,这才抽出时间来做设计大赛。
       关于空气参数记录仪,其实就是一个可以记录空气温度湿度的设备,用于建筑物内的数据采集。这个东西半年前给学校里一个老师做了几个,用的是AVR的主控,传感器是ams2302,当时还加入了光照传感器记录建筑采光,每10分钟记录采样一次直接写在SD卡里,还用oled做了ui出来。所以这次也决定做这个,于是问题来了,首先需要调试好OLED才能显示界面。经过了今天一上午的调试成果如下。

一开始是打算用IAR+官方驱动库解决的,结果在HW SPI哪里卡了半天没搞明白,索性就先转战Energia去了,之前用G2553的时候自己在上面写了一个OLED的驱动,经过简单的修改,就转到了FR5969上面,由于oled用的1306主控扫描方式比较神奇,一共8个page,一个page是128*8bit所以使用起来主要难度在于图像的变换:
  1. void OLED_SendRamBuff()
  2. {
  3.   unsigned int pointer=0;
  4.   unsigned int temp=0x00;
  5.   digitalWrite(OLED_CS,LOW);
  6.   for(unsigned int page=0;page<8;page++)
  7.   {
  8.   digitalWrite(OLED_DC,LOW);
  9.   SPI.transfer(0xb0|page);
  10.   SPI.transfer(0x10);
  11.   SPI.transfer(OLED_TYPE);
  12.   digitalWrite(OLED_DC,HIGH);
  13.   for(unsigned int x=0;x<16;x++)
  14.   {
  15.      for(unsigned int b=0;b<8;b++)
  16.     {
  17.       temp=0x00;
  18.       for(unsigned int y=0;y<8;y++)
  19.       {
  20.         if((RamBuff[pointer]>>b)&0x01)
  21.         {
  22.           temp=temp|0x80;
  23.         }
  24.         if(y!=7)
  25.         {
  26.         temp=temp>>1;
  27.         pointer+=16;
  28.         }
  29.       }
  30.       SPI.transfer(temp);
  31.       pointer-=112;
  32.    }
  33.    pointer++;
  34.   }
  35.   pointer=(page+1)*128;
  36.   }
  37.   digitalWrite(OLED_CS,HIGH);
  38. }
复制代码
顺便附上oled初始化代码(来自u8glib的启动参数):
  1. static const unsigned char pram[] = {
  2.   0x0ae,                                /* display off, sleep mode */
  3.   0x0d5, 0x080,                /* clock divide ratio (0x00=1) and oscillator frequency (0x8) */
  4.   0x0a8, 0x03f,                /* */
  5.   0x0d3, 0x000,                /*  */
  6.   0x040,                                /* start line */
  7.   0x08d, 0x014,                /* [2] charge pump setting (p62): 0x014 enable, 0x010 disable */
  8.   0x020, 0x002,                /* 2012-05-27: page addressing mode */
  9.   0x0a1,                                /* segment remap a0/a1*/
  10.   0x0c8,                                /* c0: scan dir normal, c8: reverse */
  11.   0x0da, 0x012,                /* com pin HW config, sequential com pin config (bit 4), disable left/right remap (bit 5) */
  12.   0x081, 0x0cf,                /* [2] set contrast control */
  13.   0x0d9, 0x0f1,                /* [2] pre-charge period 0x022/f1*/
  14.   0x0db, 0x040,                /* vcomh deselect level */
  15.   0x02e,                                /* 2012-05-27: Deactivate scroll */
  16.   0x0a4,                                /* output ram to display */
  17.   0x0a6,                                /* none inverted normal display mode */
  18.   0x0af
  19.   };
复制代码
Energia实现显示以后,再回头来看IAR的官方驱动库。首先要说TI这个库写的挺良心的,SPI MASTER TX的例程还是用RX中断来实习的,但是在驱动oled的时候我们不需要它响应中断,只要一直发就行了,所以我重写了这部分:
  1. uint8_t TXData = 0;
  2. void main(void)
  3. {
  4. WDT_A_hold(WDT_A_BASE);//stop watchdog
  5. //FRAM_configureWaitStateControl(FRAM_ACCESS_TIME_CYCLES_7); //if MCLK>8Mhz
  6. CS_clockSignalInit(CS_MCLK, CS_DCOCLK_SELECT, CS_CLOCK_DIVIDER_2);
  7. CS_setDCOFreq(CS_DCORSEL_1, CS_DCOFSEL_4);
  8. CS_clockSignalInit(CS_SMCLK, CS_DCOCLK_SELECT, CS_CLOCK_DIVIDER_1);//set DCO and MCLK SMCLK

  9. GPIO_setAsOutputPin(
  10. GPIO_PORT_P1,
  11. GPIO_PIN2
  12. );
  13. GPIO_setOutputHighOnPin(
  14. GPIO_PORT_P1,
  15. GPIO_PIN2
  16. );//enable p1.2 cs

  17. EUSCI_B_SPI_disable(EUSCI_B0_BASE);//eUCSI in reset mode

  18. GPIO_setAsPeripheralModuleFunctionInputPin(
  19. GPIO_PORT_P2,
  20. GPIO_PIN2,
  21. GPIO_SECONDARY_MODULE_FUNCTION
  22. );//set p2.2 to UCB0CLK

  23. GPIO_setAsPeripheralModuleFunctionInputPin(
  24. GPIO_PORT_P1,
  25. GPIO_PIN6 + GPIO_PIN7,
  26. GPIO_SECONDARY_MODULE_FUNCTION
  27. );//set P1.6&7 to UCB0SPI

  28. PMM_unlockLPM5();//unlock hi-z

  29. EUSCI_B_SPI_masterInit(EUSCI_B0_BASE,
  30. EUSCI_B_SPI_CLOCKSOURCE_SMCLK,
  31. CS_getSMCLK(),
  32. 16000000,
  33. EUSCI_B_SPI_MSB_FIRST,
  34. EUSCI_B_SPI_PHASE_DATA_CHANGED_ONFIRST_CAPTURED_ON_NEXT,
  35. EUSCI_B_SPI_CLOCKPOLARITY_INACTIVITY_HIGH,
  36. EUSCI_B_SPI_3PIN
  37. );

  38. EUSCI_B_SPI_enable(EUSCI_B0_BASE);//enable spi

  39. EUSCI_B_SPI_clearInterruptFlag(EUSCI_B0_BASE,
  40. EUSCI_B_SPI_RECEIVE_INTERRUPT
  41. );//clearflag

  42. TXData=0x00;

  43. for(int i=0;i<256;i++)
  44. {
  45. /*while (!EUSCI_B_SPI_getInterruptStatus(EUSCI_B0_BASE,
  46. EUSCI_B_SPI_TRANSMIT_INTERRUPT));*/
  47. while (!(UCB0IFG & UCTXIFG)); //very fast

  48. GPIO_setOutputLowOnPin(
  49. GPIO_PORT_P1,
  50. GPIO_PIN2
  51. );

  52. EUSCI_B_SPI_transmitData(EUSCI_B0_BASE, TXData);
  53. TXData+=0x01;

  54. }

  55. while (!EUSCI_B_SPI_getInterruptStatus(EUSCI_B0_BASE,
  56. EUSCI_B_SPI_RECEIVE_INTERRUPT));

  57. GPIO_setOutputHighOnPin(
  58. GPIO_PORT_P1,
  59. GPIO_PIN2
  60. );

  61. __no_operation();// remain in LPM0
  62. }
复制代码
这样就实现了HW SPI发送,接下来只要把指令移植过来就能正常点亮oled了,在此说说调试时候的问题,首先要说的就是TX中断的FLAG,一开始手贱在发送之前把这个flag顺手给清了,结果这个flag也不会更新,必然无法发送。再一个就是MCLK的速度。在官方程序里写的是Wait states are inserted automatically when the FRAM is accessed at speeds higher than 8MHz to prevent timing violations.但是实际上如果不手动FRAM_configureWaitStateControl(FRAM_ACCESS_TIME_CYCLES_7);一下,在MCKL快于8Mhz的时候就直接卡死了。经过测试eUSCI_B最快的发送速度差不多能到250KB/s,不知道用中断或者DMA的方式能不能更快一些。另外还发现了官方驱动库文档的一个小错误:

所有EUSCI_B里面的UCAxCTLW0其实都应该是UCBxCTLW0吧。。。不知道官方有没有勘误。。
OLED测试时候,屏下缓存到屏上缓存进行坐标变换,速度还能达到30FPS的刷新速度,对比AVR的话真的是非常快,如果是输入和屏幕扫描格式一样的图片省去坐标变换,更是可以得到惊人的110FPS刷新速度,屏幕刷新都跟不上了。。。
先扯这么多。。接着搞代码去了。。求各路大神轻拍砖。。。。

最新回复

楼主的桌子上真是惨不忍睹啊。  详情 回复 发表于 2014-12-23 18:39
 
点赞 关注

回复
举报

1万

帖子

25

TA的资源

版主

沙发
 
Energia用起来的确方便。

点评

不仅是方便 我刚才把1306驱动移到官方库里用同样的逻辑做的 结果发现官方库运行时候只能15FPS 用energia的话是30FPS 都是Mclk 8Mhz时候做的…spi速度在官方库里我设定的是还比energia里快 好像是官方库里面写引脚那  详情 回复 发表于 2014-12-22 01:16
 
 

回复

2056

帖子

0

TA的资源

五彩晶圆(初级)

板凳
 
做得不错,还看到一个ADI的东西

点评

那个是参加ADI活动送的神器 差分输入示波器+函数发生器+逻辑分析仪  详情 回复 发表于 2014-12-22 01:18
 
 
 

回复

42

帖子

0

TA的资源

一粒金砂(中级)

4
 
不仅是方便 我刚才把1306驱动移到官方库里用同样的逻辑做的 结果发现官方库运行时候只能15FPS 用energia的话是30FPS 都是Mclk 8Mhz时候做的…spi速度在官方库里我设定的是还比energia里快 好像是官方库里面写引脚那个函数太慢了…………
 
 
 

回复

42

帖子

0

TA的资源

一粒金砂(中级)

5
 
那个是参加ADI活动送的神器 差分输入示波器+函数发生器+逻辑分析仪
 
 
 

回复

599

帖子

2

TA的资源

版主

6
 
楼主的桌子上真是惨不忍睹啊。
 
个人签名有的时候要求软硬件必须并排走,哪个走的稍快一些都会被另外一个拖住的。

业务联系:

QQ:3265386825
e-Mail: yichunscp@163.com
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表