日期:2014-05-16  浏览次数:20817 次

TI板子的GPIO控制
环境:AM1808


简单的将pin拉低:
  先是方向设置,然后设置data。

177 int set_pin_down(int gpio)
178 {
179 
180 #if 1
  /*方式一 */
181 /*设置方向*/
182 u32 offset = OFFSET; //led6
183 u32 temp;
184  
185 u32 mask = 1 << offset;
186 
187 temp = __raw_readl(DIR67);
188 temp &= ~mask; //clear: 0 out
189 //temp |= mask; //set: 1 in
190 
191 
192 
193 __raw_writel(temp, DIR67); //设置方向为out
194 __raw_writel(mask, CLR_DATA67); //1.这里直接将相应的GPIO控制位清零,变为低电平
195 
196 
197 #else
  /*方式二 */

198 //gpio_direction_input(GPIO_TO_PIN(5,8));  
199 gpio_direction_output(GPIO_TO_PIN(5,8), 0);//2.通过内核API方式,拉低电平
200 #endif
201 
202 printk("<kern>down...\n");
203 printk("<kern>read pin: %x\n", gpio_get_value(GPIO_TO_PIN(5,8))); //获取GPIO状态
204 return 0;
205 }


-----------------------------


实践现象:
  让硬件工程师手动拉高拉低pin脚,gpio_get_value函数正确返回高低状态变化,示波器显示正常。
 
方式一,
  电平拉不低。
方式二,
  电平拉不低。



问,控制方式是否有错,请指教。


还有一问:

TI ARM的GPIO控制,如下:


38h DIR23  
0 GPk[j] is an output.
1 GPk[j] is an input.

   
3Ch OUT_DATA23 
0 GPk[j] is driven low.
1 GPk[j] is driven high.

40h SET_DATA23 
0 No effect.
1 GPk[j] is set to output logic high.

44h CLR_DATA23 
0 No effect.
1 GPk[j] is set to output logic low.

48h IN_DATA23
0 GPk[j] is logic low.
1 GPk[j] is logic high.


(a)SET_DATA23,CLR_DATA23 的置零位都无效,置1分别表示拉高拉低。应该是配合使用,拉高拉低GPIO。

(b)OUT_DATA23,IN_DATA23 各自既可拉高又可拉低。

拉高拉低GPIO貌似通过(a)(b)都可以实现?
不明白,请指点。



------解决方案--------------------
应该都是可以的,不过你既然设置为输出,为什么还要读取回来呢,应该用硬件测试电平吧。

用过他们的板子当时没有出过问题,仔细看看数据手册吧。