智能车制作

标题: 我写了个IIC通信程序可是无论怎么采集都是255请高手指点下 [打印本页]

作者: fengtian123    时间: 2011-12-8 10:35
标题: 我写了个IIC通信程序可是无论怎么采集都是255请高手指点下
  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. }
复制代码

作者: fengtian123    时间: 2011-12-8 10:50
顶起~~~求助
作者: fengtian123    时间: 2011-12-8 10:51
顶起~~~求助
作者: fengtian123    时间: 2011-12-8 11:58
1111111
作者: midanshen1    时间: 2011-12-8 12:42
看不懂!!!
作者: ttzaio    时间: 2011-12-8 13:40
可能某些端口的赋值有冲突,
作者: fengtian123    时间: 2011-12-8 16:57
回复 6# ttzaio
刚刚测试了下~发现从机不发送应答信号~哎
作者: whut_RY    时间: 2011-12-8 19:34
是从BDM上看的吗?我的SPI也是这样全是255但是它确实工作了
作者: xining_yang    时间: 2011-12-8 21:46
这个是干吗用的????
作者: fengtian123    时间: 2011-12-8 21:58
回复 8# whut_RY

额~我这个不是用的SPI用的是IIC  SPI没有调试成功~不知道为什么~BDM不出数据用串口发送出来的数据也不对啊~
作者: 双驱二轮车    时间: 2011-12-8 22:07
进度都很快呀,我们还在找电路模块呢
作者: whut_RY    时间: 2011-12-9 22:56
回复 10# fengtian123
内部SPI我没有调成功,但是确实出波形了,最后用IO口模拟做好了,我说的是5110液晶驱动。加速度传感器MMA8451要用IIC,这个自己写有难度啊,不知道要折腾几天,痛苦。。。
作者: fengtian123    时间: 2011-12-11 16:26
回复 12# whut_RY


   我的加速度传感器是MMA7455这个芯片可以用SPI方式和IIC方式通信的~现在贴出来的程序就是用I/O模拟IIC方式进行通信的程序~可是就是不能出东西~哎无语了~不知道你的IIC程序怎么写的~能借鉴下么?
后来用标志位进行调节了~发现从机不产生应答信号~哎~无语啊~
作者: whut_RY    时间: 2011-12-12 12:26
我这个星期晚上才有时间,写好了交流交流
作者: bdc90    时间: 2011-12-12 18:42
回复 13# fengtian123


   哈哈,本人用XS128读写过24C02 么得问题
作者: whut_RY    时间: 2011-12-14 11:59
回复 13# fengtian123
你的问题是没有设置端口的方向
作者: 恋May    时间: 2011-12-14 13:54

作者: fengtian123    时间: 2011-12-17 11:48
回复 16# whut_RY


    有啊~outa为 #define outa DDRT_DDRT1
作者: fengtian123    时间: 2011-12-17 11:48
回复 15# bdc90

额要注意点什么呢?能给写提示么?
作者: bdc90    时间: 2011-12-17 19:42
回复 19# fengtian123
就是多了个方向寄存器的设置。这是移植的代码,你可以参考参考。
作者: hanahimiEX    时间: 2011-12-18 17:32
看不出来啊
作者: hanahimiEX    时间: 2011-12-18 17:33
怎么回事啊
作者: 15239172008    时间: 2012-2-16 20:54
等待高手……

作者: 15239172008    时间: 2012-2-16 20:56

作者: B-Boy_Chao    时间: 2012-5-12 13:58
你发送的地址对吗?
作者: miss_lion    时间: 2015-5-8 12:04
请问您的问题解决了么




欢迎光临 智能车制作 (http://111.231.132.190/) Powered by Discuz! X3.2