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)都可以实现?
不明白,请指点。
[解决办法]
应该都是可以的,不过你既然设置为输出,为什么还要读取回来呢,应该用硬件测试电平吧。
用过他们的板子当时没有出过问题,仔细看看数据手册吧。