主题中讨论的其他器件:SysConfig
工具与软件:
通过"DL_GPIO_readPins" API 读取的引脚状态与实际引脚状态不匹配时、我会遇到这个问题。 我最初将引脚配置为输出、然后将其切换到输入以读取其状态。 但是、API 返回不正确的值。 我已经使用万用表和示波器确认了正确的引脚状态。
环境详细信息:
Code Composer Studio 12.7.1
SDK 2.01.00.03
SysConfig 1.20.0.3587
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
工具与软件:
通过"DL_GPIO_readPins" API 读取的引脚状态与实际引脚状态不匹配时、我会遇到这个问题。 我最初将引脚配置为输出、然后将其切换到输入以读取其状态。 但是、API 返回不正确的值。 我已经使用万用表和示波器确认了正确的引脚状态。
环境详细信息:
Code Composer Studio 12.7.1
SDK 2.01.00.03
SysConfig 1.20.0.3587
while (1){
如果(! DL_GPIO_readPins (GPIO_GRP_0_PORT、GPIO_GRP_0_PIN_0_PIN)
{
DL_GPIO_setPins (GPIO_LEDS_PORT、GPIO_LEDS_USER_LED_1_PIN);
}
设计
{
DL_GPIO_clearPins (GPIO_LEDS_PORT、GPIO_LEDS_USER_LED_1_PIN);
}
DL_GPIO_setPins (GPIO_GRP_0_PORT、GPIO_GRP_0_PIN_0_PIN);
DL_GPIO_initDigitalOutput (GPIO_GRP_0_PIN_0_IOMUX);
DL_GPIO_enableOutput (GPIO_GRP_0_PORT、GPIO_GRP_0_PIN_0_PIN);
delay_cycles (128);
DL_GPIO_disableOutput (GPIO_GRP_0_PORT、GPIO_GRP_0_PIN_0_PIN);
DL_GPIO_initDigitalInputFeatures (GPIO_GRP_0_PIN_0_IOMUX、
DL_GPIO_INVERSION _DISABLE、DL_GPIO_RESISTOR_NONE
DL_GPIO_HYSTERESIS_DISABLE、DL_GPIO_WAKEUP_DISABLE);
}
我尝试了将此代码序列修补到 L1306上的示例 GPIO_TOGGLE_OUTPUT、从而更改 GPIO_GRP_0_PIN_0_PIN -> GPIO_LEDS_USER_TEST_PIN 。 我先尝试将 USER_TEST_PIN 作为 PA1 (如示例中的配置)、然后是 PA3。
使用 PA1 (没有外部上拉)、我看到引脚上没有响应(符合预期)、因为无法将其驱动为高电平。
使用 PA3时、我看到引脚会变为高电平并持续大约4微秒、然后会变成低漂移(符合预期)。 自从 INENA=0后、DIN 寄存器没有改变。
你发布的代码不能测试调用 enableOutput ()的情况下,当引脚是一个输入。 当我尝试此操作(通过删除对 DL_GPIO_initDigitalOutput 的调用)时、我看到引脚在 enableOutput ()之后变为高电平、与前一种情况一样、DIN 寄存器变为1。 在 disableOutput ()后、引脚漂移为低电平;由于 DIN 寄存器反映了引脚的状态(而不是 DOUT)、因此它最终也变为0 [参考 TRM (SLAU847D)图9-1]。
我想我不明白你的目标。 要获得一个输出引脚、您可以读回、将其配置为"输入"[INENA=1]、然后使用 DL_GPIO_enableOutput [DOE=1]进行驱动。 或者、您是否正在尝试执行其他操作?
1)在 INENA=1和 DOE=0时,引脚是 Hi-Z ,你可以读回它——一个"纯"输入。
2)在 INENA=0和 DOE=1的情况下,引脚被驱动,但你不能读回它——一个"纯"输出。
3) 3)当 INENA=1和 DOE=1时、该引脚被驱动、您可以读回该引脚的状态。 [如果您从外部将引脚下拉得足够硬、则即使驱动为高电平、也可能读取到很低。 这当然不是建议的,但它有时是偶然发生的。]
实际上、我希望将该引脚配置为软件 I2C SDA。 发送一个字节后、我始终会从从器件收到高引脚状态(NACK)。 示波器清楚地显示通过将 SDA 线拉至低电平来确认从器件、但引脚状态读取仍显示为高电平。 另外、从从从器件读取值时、始终得到0xFF、这与示波器上观察到的值不匹配。 谢谢你。
#define SDA_HIGH () DL_GPIO_setPins (GPIO_OUTPUTS_PORT、GPIO_OUTPUTS_SDA_PIN); \
DL_GPIO_initDigitalOutput (GPIO_OUTPUTS_SDA_IOMUX); \
DL_GPIO_enableOutput (GPIO_Outputs_port、GPIO_Outputs_SDA_PIN)
#define SDA_LOW () DL_GPIO_clearPins (GPIO_OUTPUTS_PORT、GPIO_OUTPUTS_SDA_PIN); \
DL_GPIO_initDigitalOutput (GPIO_OUTPUTS_SDA_IOMUX); \
DL_GPIO_enableOutput (GPIO_Outputs_port、GPIO_Outputs_SDA_PIN)
#define SDA_INPUT () DL_GPIO_disableOutput (GPIO_OUTPUTS_PORT、GPIO_OUTPUTS_SDA_PIN);\
DL_GPIO_initDigitalInputFeatures (GPIO_OUTPUTS_SDA_IOMUX、\
DL_GPIO_INVERSION _DISABLE、DL_GPIO_RESISTOR_NONE、\
DL_GPIO_HYSTERESIS_DISABLE、DL_GPIO_WAKEUP_DISABLE)
要制作一个 I2C-ISH 总线、我会从:
1) 1)将 SCL/SDA 配置为输入并保持其不变
2) 2)设置 SCL/SDA = 0 (clearPins)并将其保留在那里。
3) SDA_LOW ()则为"DL_GPIO_enableOutput"(与 SCL 类似)以驱动为低电平
4) SDA_HIGH ()为"DL_GPIO_disableOutput"(也适用于 SCL)以悬空(拉至)高电平
5) SDA_INPUT()可以移除、或者保留为 DL_GPIO_disableOutput、以防万一(也适用于 SCL)
也就是说,我没有看到任何明显的东西会导致你所描述的症状. 我怀疑您发布的代码之外有什么内容。
您是否使用了开漏引脚(PA0/1)? 我认为这不会改变我的建议、但我可能会忘记一些细节。
[编辑:轻微澄清]