• «
  • 1
  • 2
  • »
  • Pages: 1/2     Go
主题 : 艰难地实现了6410的裸机IIC程序(望大家改进) 复制链接 | 浏览器收藏 | 打印
级别: 侠客
UID: 39247
精华: 2
发帖: 51
金钱: 355 两
威望: 71 点
贡献值: 2 点
综合积分: 142 分
注册时间: 2011-03-07
最后登录: 2015-05-31
楼主  发表于: 2011-05-24 19:37

 艰难地实现了6410的裸机IIC程序(望大家改进)

复制代码
  1. #include "s3c6410_addr.h"
  2. #include "interrupt.h"
  3. #include "defs.h"
  4. #include "utils.h"
  5. #define RESET 0xaf
  6. #define MASTER_TX_START 0xf0
  7. #define MASTER_TX_STOP 0xd0
  8. #define MASTER_RX_START 0xB0
  9. #define MASTER_RX_STOP 0x90
  10. #define READ 0
  11. #define WRITE 1
  12. #define DUMMY 4
  13. static volatile U8 data[2];
  14. static volatile U8 data_ptr;
  15. static volatile U8 done;
  16. static volatile U8 mode;
  17. void __irq interrupt(void)
  18. {
  19. switch(mode){
  20. case DUMMY:
  21. rIICDS0 = data[data_ptr++];
  22. rIICCON0 = RESET;
  23. done = 1;
  24. break;
  25. case READ:
  26. if(data_ptr == 0){
  27. data[data_ptr++] = rIICDS0;
  28. rIICCON0 = 0x2f;
  29. break;
  30. }else{
  31. data[data_ptr++] = rIICDS0;
  32. rIICSTAT0 = MASTER_RX_STOP;
  33. rIICCON0 = RESET;
  34. Delay(1);//这里两个延时很重要
  35. done = 1;
  36. break;
  37. }
  38. case WRITE:
  39. //Uart_Printf("in interrupt: write\n");
  40. if(data_ptr == 1){
  41. rIICSTAT0 = MASTER_TX_STOP;
  42. rIICCON0 = RESET;
  43. Delay(1);//这里两个延时很重要
  44. done = 1;
  45. break;
  46. }else{
  47. rIICDS0 = data[data_ptr++];
  48. rIICCON0 = RESET;
  49. break;
  50. }
  51. default:
  52. break;
  53. }
  54. INTC_ClearVectAddr();
  55. }
  56. void read(U8 slvaddr, U8 addr, U8 *data_out)
  57. {
  58. mode = DUMMY;
  59. data[0] = addr;
  60. data_ptr = 0;
  61. rIICDS0 = slvaddr;
  62. rIICSTAT0 = MASTER_TX_START;
  63. rIICCON0 = RESET;
  64. while(!done);
  65. mode = READ;
  66. data_ptr = 0;
  67. rIICDS0 = slvaddr;
  68. rIICSTAT0 = MASTER_RX_START;      
  69. rIICCON0 = RESET;
  70. while(!done);
  71. *data_out = data[0];
  72. }
  73. void write(U8 slvaddr, U8 addr, U8 *data_in)
  74. {
  75. //Uart_Printf("in write\n");
  76. mode = WRITE;
  77. data[0] = addr;
  78. data[1] = *data_in;
  79. data_ptr = 0;
  80. done = 0;
  81. rIICDS0 = slvaddr;
  82. rIICSTAT0 = MASTER_TX_START;
  83. rIICCON0 = RESET;
  84. while(!done);//Uart_Printf("in  write loop\n");
  85. //Delay(1);
  86. }
  87. void init(void)
  88. {
  89. rGPEPUD &= ~(0xf << 10);
  90. rGPBCON = rGPBCON & ~(0xfF << 20) | (0x22 << 20);
  91. INTC_Init();
  92. INTC_SetIntISR(INT_I2C0, interrupt);
  93. INTC_Enable(INT_I2C0);
  94. Delay(0);
  95. }
  96. void iic(void)
  97. {
  98. U16 i;
  99. U8 tmp[256];
  100. init();
  101. Uart_Printf("iic testing\n");
  102. for(i = 0; i < 256; i++){
  103. tmp[i] = (U8)i;
  104. write(0xa0, (U8)i, &tmp[i]);
  105. tmp[i] = 0;
  106. }
  107. Uart_Printf("datas have been written to rom\n\n");
  108. Uart_Printf("now read them rom\n");
  109. for(i = 0; i < 256; i++){
  110. read(0xa0, (U8)i, &tmp[i]);
  111. Uart_Printf("%3x", tmp[i]);
  112. if((i + 1) % 16 == 0)
  113. Uart_Printf("\n");
  114. }
  115. }
  116. void xmain(void)
  117. {
  118. Uart_Init();
  119. iic();
  120. while(1);
  121. }
[ 此帖被venkee.com在2011-06-17 20:17重新编辑 ]
级别: 侠客
UID: 39247
精华: 2
发帖: 51
金钱: 355 两
威望: 71 点
贡献值: 2 点
综合积分: 142 分
注册时间: 2011-03-07
最后登录: 2015-05-31
1楼  发表于: 2011-05-30 21:37
没人给意见,自己顶!
级别: 侠客
UID: 34184
精华: 0
发帖: 58
金钱: 290 两
威望: 58 点
贡献值: 0 点
综合积分: 116 分
注册时间: 2010-12-12
最后登录: 2013-07-12
2楼  发表于: 2011-05-31 19:10
顶顶。。。。
学习学习学习。。努力学习
菜鸟在路上
级别: 圣骑士
UID: 42749
精华: 6
发帖: 241
金钱: 1530 两
威望: 306 点
贡献值: 6 点
综合积分: 602 分
注册时间: 2011-04-11
最后登录: 2016-07-19
3楼  发表于: 2011-06-01 23:50
顶以后学习
级别: 新手上路
UID: 48486
精华: 0
发帖: 8
金钱: 40 两
威望: 8 点
贡献值: 0 点
综合积分: 16 分
注册时间: 2011-06-01
最后登录: 2017-09-13
4楼  发表于: 2011-06-02 09:41
想问一下楼主 关于这个irq中断 你的跳转实现了?
INTC_SetIntISR
INTC_Enable
之后就可以中断产生啦??
级别: 新手上路
UID: 48486
精华: 0
发帖: 8
金钱: 40 两
威望: 8 点
贡献值: 0 点
综合积分: 16 分
注册时间: 2011-06-01
最后登录: 2017-09-13
5楼  发表于: 2011-06-02 09:58
我之前做的程序 想用中断EINT0

在启动代码里加了开启VIC port的三句代码

然后再main函数里面也调用了INTC_Init   INTC_SetIntISR   INTC_Enable三个函数来开启一个中断  然后中断产生了 可是就是没有跳转到isr上面  不知道楼主这个地方是不是成功了。
级别: 新手上路
UID: 44362
精华: 0
发帖: 31
金钱: 160 两
威望: 32 点
贡献值: 0 点
综合积分: 62 分
注册时间: 2011-04-24
最后登录: 2012-10-09
6楼  发表于: 2011-06-02 11:51

 回 4楼(embededme) 的帖子

INTC_SetIntISR(INT_I2C0, interrupt);
这个函数的参数你好好看下 就知道它是怎么给地址了
级别: 侠客
UID: 39247
精华: 2
发帖: 51
金钱: 355 两
威望: 71 点
贡献值: 2 点
综合积分: 142 分
注册时间: 2011-03-07
最后登录: 2015-05-31
7楼  发表于: 2011-06-02 12:38

 回 5楼(embededme) 的帖子

很负责的告诉你,不实现的代码,我不敢放上论坛,是ads的设置问题,--first这个选项应该是startup.o(Init),这是我的设置,我曾经把一段用for循环实现的delay代码放到main函数前,而first参数没设置好,然后一开始总是就执行delay的代码了!具体你的问题出现在哪里?因为开发环境不同,所以设置问题带来的运行差异我是无法解决的,但我很负责的说,代码很多人都验证过是可以的!如果你老是不行,就先拿我的bin文件试下,这是说明我代码没问题的最好方法!
级别: 新手上路
UID: 39452
精华: 0
发帖: 24
金钱: 120 两
威望: 24 点
贡献值: 0 点
综合积分: 48 分
注册时间: 2011-03-09
最后登录: 2012-07-06
8楼  发表于: 2011-07-08 16:45
顶啊,那么好的东西
级别: 新手上路
UID: 54471
精华: 0
发帖: 8
金钱: 40 两
威望: 8 点
贡献值: 0 点
综合积分: 16 分
注册时间: 2011-08-31
最后登录: 2012-03-15
9楼  发表于: 2011-09-09 10:18
请问有没有tiny6410mmu之类的裸机程序,分享分享?
  • «
  • 1
  • 2
  • »
  • Pages: 1/2     Go