智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 5695|回复: 25
打印 上一主题 下一主题

我写了个IIC通信程序可是无论怎么采集都是255请高手指点下

  [复制链接]

11

主题

84

帖子

0

精华

高级会员

Rank: 4

积分
953
QQ
威望
520
贡献
249
兑换币
24
注册时间
2011-3-1
在线时间
92 小时
跳转到指定楼层
1#
发表于 2011-12-8 10:35:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include <hidef.h> /* common defines and macros */
  2. #include <MC9S12XS128.h> /* derivative information */
  3. #pragma LINK_INFO DERIVATIVE "mc9s12xs128"



  4. #define uint unsigned int
  5. #define uchar unsigned char
  6. #define SDA PTT_PTT1
  7. #define SCL PTT_PTT2



  8. uchar I2C_ERROR; /*应答标志位*/
  9. uchar reader ;

  10. #define WRITE 0x1d /*写器件地址 */
  11. #define READ 0x1d /*读器件地址 */
  12. void sci (void){
  13. SCI0CR1=0x00; //设置SCI0为正常模式,八位数据位,无奇偶校验
  14. SCI0CR2_TE=1; //允许发送
  15. SCI0CR2_RE=1; //允许接受
  16. SCI0CR2_RIE=1; //允许接受中断
  17. //botelu=busclock/(bd(h,l)*16)=80MHZ/(520*16)=9600
  18. SCI0BD=208;
  19. }
  20. void shuchuzifu(char ch){
  21. if (ch =='\n')
  22. {
  23. while(!(SCI0SR1&0x80)) ;
  24. SCI0DRL= 0x0d; //output'CR'
  25. return;
  26. }
  27. while(!(SCI0SR1&0x80)) ; //keep waiting when not empty
  28. SCI0DRL=ch;
  29. }

  30. void SetBusCLK_32M(void)
  31. {
  32. CLKSEL=0X00; // disengage PLL to system
  33. PLLCTL_PLLON=1; // turn on PLL
  34. SYNR =0x40 | 0x03; // pllclock=2*osc*(1+SYNR)/(1+REFDV)=64MHz;
  35. REFDV=0x80 | 0x01;
  36. POSTDIV=0x00;
  37. _asm(nop); // BUS CLOCK=32M
  38. _asm(nop);
  39. while(!(CRGFLG_LOCK==1)); //when pll is steady ,then use it;
  40. CLKSEL_PLLSEL =1; //engage PLL to system;
  41. }

  42. void init_system()
  43. {
  44. DDRT_DDRT2=1;
  45. DDRT_DDRT1=1;
  46. }


  47. /****************************准确延时*****************************/
  48. void Delay()//////// /*根据晶振频率制定延时时间*/
  49. {

  50. _asm NOP; _asm NOP;_asm NOP;_asm NOP;_asm NOP;
  51. _asm NOP; _asm NOP;_asm NOP;_asm NOP;_asm NOP;
  52. _asm NOP; _asm NOP;_asm NOP;_asm NOP;_asm NOP;
  53. _asm NOP; _asm NOP;_asm NOP;_asm NOP;_asm NOP;
  54. _asm NOP; _asm NOP;_asm NOP;_asm NOP;_asm NOP;
  55. _asm NOP; _asm NOP;_asm NOP;_asm NOP;

  56. }

  57. void Delay1us(int c)
  58. {
  59. int cnt;
  60. for(cnt=0;cnt<c;cnt++)
  61. {
  62. asm("nop"); asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
  63. asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
  64. asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
  65. }

  66. }
  67. void initiic() {

  68. SCL=1;
  69. Delay1us(5);
  70. SDA=1;
  71. Delay1us(5);
  72. }
  73. /*******************************************************************
  74. 起动总线函数
  75. 函数原型: void Start_I2c();
  76. 功能: 启动I2C总线,即发送I2C起始条件.
  77. ********************************************************************/
  78. void I2C_START()
  79. {
  80. SDA=1;
  81. Delay1us(5);
  82. SCL=1;
  83. Delay1us(5);
  84. SDA=0;
  85. Delay1us(5);
  86. }
  87. /*******************************************************************
  88. 结束总线函数
  89. 函数原型: void Stop_I2c();
  90. 功能: 结束I2C总线,即发送I2C结束条件.
  91. ********************************************************************/
  92. void I2C_STOP()
  93. {
  94. SDA=0; /*发送结束条件的数据信号*/
  95. Delay1us(5); /*发送结束条件的时钟信号*/
  96. SCL=1; /*结束条件建立时间大于4us*/
  97. Delay1us(5);
  98. SDA=1; /*发送I2C总线结束信号*/
  99. Delay1us(5);
  100. }
  101. /*******************************************************************/
  102. void send_nack()
  103. {
  104. SDA=1;
  105. Delay1us(5);
  106. SCL=1;
  107. Delay1us(5);
  108. SCL=0;
  109. Delay1us(5);
  110. }

  111. /*******************************************************************
  112. 检查应答位
  113. ********************************************************************/

  114. void check_ack()
  115. {
  116. uchar i=0;
  117. SCL=1;
  118. DDRT_DDRT1=0;
  119. Delay1us(5);
  120. while((SDA==1)&&(i<255))
  121. i++;
  122. SCL=0;
  123. Delay1us(5);
  124. DDRT_DDRT1=1;
  125. }
  126. /*******************************************************************
  127. 发送1字节数据
  128. ********************************************************************/
  129. void I2C_send(uchar data)
  130. {
  131. uint i=8;
  132. uchar m=data;
  133. uchar temp;
  134. for(i=8;i>0;i--){
  135. temp=m&0x80;
  136. SCL=0;
  137. Delay1us(5);
  138. if(temp==0x80)
  139. SDA=1;
  140. else
  141. SDA=0;
  142. Delay1us(5);
  143. SCL=1;
  144. Delay1us(5);
  145. m=m<<1;
  146. }
  147. SCL=0;
  148. Delay();
  149. SDA=1;
  150. Delay();
  151. shuchuzifu('0');
  152. }
  153. /********************************************************************
  154. 接收1字节数据
  155. ********************************************************************/
  156. void I2C_receive1byte()
  157. {
  158. int i=8;
  159. uchar j=0;
  160. SCL=0;
  161. Delay1us(5);
  162. SDA=1;
  163. Delay1us(5);
  164. DDRT_DDRT1=0;
  165. for(i=8;i>0;i--)
  166. {
  167. SCL=1;
  168. Delay1us(5);
  169. j=(j<<1)|SDA;
  170. SCL=0;
  171. Delay1us(5);
  172. }
  173. DDRT_DDRT1=1;
  174. reader=j;//把reader定义成全局变量
  175. shuchuzifu('1');
  176. }

  177. /*******************************************************************
  178. ******通过I2C总线向某一寄存器写入一个字节数据********
  179. ********************************************************************/
  180. void I2C_write(uchar sub_address,uchar content)
  181. {
  182. I2C_START();
  183. I2C_send(0X3A);
  184. check_ack();
  185. I2C_send(sub_address);
  186. check_ack();
  187. I2C_send(content);
  188. check_ack();
  189. I2C_STOP();

  190. }
  191. /*******************************************************************
  192. 通过I2C总线读出某一寄存器的数据
  193. 注意: 使用前必须已结束总线。
  194. ********************************************************************/
  195. void I2C_READ(uchar address)
  196. {
  197. I2C_START();
  198. I2C_send(0X3A);
  199. check_ack();

  200. I2C_send(address);
  201. check_ack();
  202. I2C_START();
  203. I2C_send(0X3A+1);
  204. check_ack();
  205. I2C_receive1byte();
  206. check_ack();
  207. I2C_STOP();

  208. }
  209. //}
  210. /*****************************************************************/
  211. void main()
  212. {
  213. int i=0;
  214. SetBusCLK_32M() ;
  215. sci();
  216. init_system();
  217. initiic();
  218. I2C_write(0x16,0x05);
  219. I2C_write(0x10,0x32);

  220. for(;;)
  221. {
  222. I2C_READ(0x06);

  223. shuchuzifu(reader);
  224. for(i=0;i<100;i++)
  225. _asm NOP;

  226. }

  227. }
复制代码

11

主题

84

帖子

0

精华

高级会员

Rank: 4

积分
953
QQ
威望
520
贡献
249
兑换币
24
注册时间
2011-3-1
在线时间
92 小时
2#
 楼主| 发表于 2011-12-8 10:50:36 | 只看该作者
顶起~~~求助
回复 支持 反对

使用道具 举报

11

主题

84

帖子

0

精华

高级会员

Rank: 4

积分
953
QQ
威望
520
贡献
249
兑换币
24
注册时间
2011-3-1
在线时间
92 小时
3#
 楼主| 发表于 2011-12-8 10:51:56 | 只看该作者
顶起~~~求助
回复 支持 反对

使用道具 举报

11

主题

84

帖子

0

精华

高级会员

Rank: 4

积分
953
QQ
威望
520
贡献
249
兑换币
24
注册时间
2011-3-1
在线时间
92 小时
4#
 楼主| 发表于 2011-12-8 11:58:21 | 只看该作者
1111111
回复 支持 反对

使用道具 举报

3

主题

85

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1576
QQ
威望
805
贡献
261
兑换币
4
注册时间
2011-9-26
在线时间
255 小时
5#
发表于 2011-12-8 12:42:09 | 只看该作者
看不懂!!!
回复 支持 反对

使用道具 举报

12

主题

401

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2842
QQ
威望
765
贡献
1865
兑换币
25
注册时间
2011-10-9
在线时间
106 小时
6#
发表于 2011-12-8 13:40:44 | 只看该作者
可能某些端口的赋值有冲突,
回复 支持 反对

使用道具 举报

11

主题

84

帖子

0

精华

高级会员

Rank: 4

积分
953
QQ
威望
520
贡献
249
兑换币
24
注册时间
2011-3-1
在线时间
92 小时
7#
 楼主| 发表于 2011-12-8 16:57:54 | 只看该作者
回复 6# ttzaio
刚刚测试了下~发现从机不发送应答信号~哎
回复 支持 反对

使用道具 举报

29

主题

700

帖子

0

精华

跨届大侠

Rank: 10Rank: 10Rank: 10

积分
6749

论坛元老奖章热心会员奖章在线王奖章优秀会员奖章活跃会员奖章

QQ
威望
2529
贡献
1556
兑换币
665
注册时间
2011-1-10
在线时间
1332 小时
8#
发表于 2011-12-8 19:34:13 | 只看该作者
是从BDM上看的吗?我的SPI也是这样全是255但是它确实工作了
回复 支持 反对

使用道具 举报

4

主题

443

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1849
威望
1067
贡献
556
兑换币
57
注册时间
2011-8-31
在线时间
113 小时
9#
发表于 2011-12-8 21:46:37 | 只看该作者
这个是干吗用的????
回复 支持 反对

使用道具 举报

11

主题

84

帖子

0

精华

高级会员

Rank: 4

积分
953
QQ
威望
520
贡献
249
兑换币
24
注册时间
2011-3-1
在线时间
92 小时
10#
 楼主| 发表于 2011-12-8 21:58:34 | 只看该作者
回复 8# whut_RY

额~我这个不是用的SPI用的是IIC  SPI没有调试成功~不知道为什么~BDM不出数据用串口发送出来的数据也不对啊~
回复 支持 反对

使用道具 举报

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

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-9-21 15:30 , Processed in 0.221618 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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