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.
你(们)好
我无法从 I2C 获取中断。 以下设置代码是否正确?
//为 I2C 设置 PB2、PB3
GPIOPinTypeI2C (GPIO_PORTB_BASE、GPIO_PIN_2 | GPIO_PIN_3);
//基于 PB2、PB3的 I2C
GPIOPinConfigure (GPIO_PB2_I2C0SCL);
GPIOPinConfigure (GPIO_PB3_I2C0SDA);
//启用 I2C0
SysCtlPeripheralEnable (SYSCTL_Periph_I2C0);
//等待外设就绪
while (!SysCtlPeripheralReady (SYSCTL_Periph_I2C0));
I2CMasterInitExpClk (I2C0_BASE、时钟、false);
I2CIntRegister (I2C0_BASE、I2C0_handler);
I2CMasterIntEnableEx (I2C0_BASE、I2C_MASTER_INT_STOP |
I2C_MASTER_INT_NACK |
I2C_MASTER_INT_DATA |
I2C_MASTER_INT_TIMEOUT);
I2CMasterEnable (I2C0_BASE);
如果我尝试向未连接的设备发送数据,我将接收 NACK 中断....
I2CMasterSlaveAddrSet (I2C0_BASE、0x55、false);
I2CMasterDataPut (I2C0_BASE、'*');
I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_SINGLE_SEND);
while (true);
但没有什么...
此致
您好、Luca、
您的代码中是否也有任何系统范围中断使能 API?
我看到的只是 I2C 配置代码、但您还需要进行以下调用:
ROM_IntEnable (INT_I2C0); ROM_IntMasterEnable ();
(ROM 前缀是可选的)
此外、 您是否具有 SYSCTL_Periph_GPIOB 的 SysCtlPeripheralEnable?
你(们)好
现在我有中断、 不是添加代码、而是仅更改 SCL 和 SDA 的引脚设置、如下所示:
GPIOPinTypeI2CSCL (GPIO_PORTB_BASE、GPIO_PIN_2);
GPIOPinTypeI2C (GPIO_PORTB_BASE、GPIO_PIN_3);
我认为 ARB 中断中断功能未启用。
我希望使用中断、因为尝试使用轮询向未连接的外设发送命令我不会遇到任何错误、这是可能的吗?
此致
你(们)好
查看 Tiva 数据表、我编写这个简单的轮询例程来写入2个或更多字节。 但是、如果我单步执行正确的代码、那么在没有任何连接的从器件的情况下、我也不会有错误???
bool I2CWrite (uint8_t address、uint8_t count) { bool eito = false; bool end = false; G_i2c0.txptr = 0; //写入从机地址 I2CMasterSlaveAddrSet (I2C0_BASE、地址、false); //写入数据 I2CMasterDataPut (I2C0_BASE、g_i2c0.TXD[g_i2c0.txptr+]); //开始传输 I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_BURST_SEND_START); // 操作 { while (I2CMasterBusy (I2C0_BASE)); // if (I2CMasterErr (I2C0_BASE)) { //中止传输 I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_BURST_SEND_STOP); 结束= true; } 其他 { // if (g_i2c0.txptr < count) { //写入下一个数据 I2CMasterDataPut (I2C0_BASE、g_i2c0.TXD[g_i2c0.txptr+]); //继续传输 I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_BURST_SEND_CONT); } 其他 { //完成传输 I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_BURST_SEND_FINISH); while (I2CMasterBusy (I2C0_BASE)); if (!I2CMasterErr (I2C0_BASE)) { esito = true; } 结束= true; } } while (!end); return( esito ); }
您好、Luca、
很抱歉、我在第一个回复中没有看到引脚配置、很高兴您发现了这一点。
关于没有从器件时缺少错误的问题、我的第一个想法是、也许您甚至不会看到 I2C 模块出现错误、但由于您有中断、这似乎不太可能。
调试代码时、您是否实际到达 I2CMasterErr 行?
您是否还在示波器上检查了信号的外观? 我猜、如果您遇到中断、您已经安装了上拉电阻器。
您好 Ralph
您说得对、我只使用中断时出错、但如果我使用轮询、我没有任何错误。 此外、我在轮询过程中有一个奇怪的行为、因为我昨天发送给您的代码只能执行不应运行的步进、就像数据寄存器将被覆盖... 今天、我使用中断进行了广告...
注意事项
卢卡
你(们)好
如果我在 I2C 主中断过程中调用 I2CMasterErr(),而不是使用 I2CMasterBusy,那么我使用在 I2C 主中断过程中清除的标志,一切正常。
此致