我尝试使用SoftI2CMaster库[http://playground.arduino.cc/Main/SoftwareI2CLibrary],在大多数情况下该库运行良好,但它不适用于端口H到L,编译器给我以下消息:
/SoftI2CMaster.h: In function 'boolean i2c_init()':
/SoftI2CMaster.h:265: error: impossible constraint in 'asm'
导致问题的代码基本上是一些程序集:
__asm__ __volatile__
(
...
: :
[SCLDDR] "I" (SCL_DDR), [SCLPIN] "I" (SCL_PIN),
[SCLIN] "I" (SCL_IN), [SCLOUT] "I" (SCL_OUT));
经过一些测试,试验和错误,我很确定问题来自SCL_DDR和那些相关的变量,这是他们定义的方式:
#define SDA_DDR (_SFR_IO_ADDR(SDA_PORT) - 1)
#define SCL_DDR (_SFR_IO_ADDR(SCL_PORT) - 1)
#define SDA_OUT _SFR_IO_ADDR(SDA_PORT)
#define SCL_OUT _SFR_IO_ADDR(SCL_PORT)
#define SDA_IN (_SFR_IO_ADDR(SDA_PORT) - 2)
#define SCL_IN (_SFR_IO_ADDR(SCL_PORT) - 2)
对于SXX_PORT,如果我提供任何东西PORTA-PORTG都没问题,程序编译并执行没有问题,但是如果我提供PORTH-PORTK错误将会出现。任何人都可以指出问题是什么?来自_SFR_IO_ADDR()的问题是什么?
答案 0 :(得分:1)
约束"I"
需要一个从0到63的常量。如果选择其中一个较高端口,则地址(_SFR_IO_ADDR()
)将高于63。
您可以尝试将修改器更改为"M"
,这需要8位的常量拟合。我不知道这是否有效,或者作者为何选择使用"I"
。
如果有效,您可以向作者发送错误报告。