您好!
我正在尝试按照数据表中给出的流程图从 I2C 向外传输4个字节。 但是、我只能看到0x34和0x78从示波器发出、而另外2个字节在空中丢失。 下面是供参考的代码和流程图。 我需要再用两双眼睛来查看 我在代码中遗漏的内容。 谢谢。
我的代码:
int main (空)
{
//启用 I2C 和 GPIO 端口 A 的时钟
*((uint32_t *)(SYSCTL_RCGCI2C))|=(0x01 <<9);
*((uint32_t *)(SYSCTL_RCGCGPIO))|=(0x00001 << 0);
//等待 SSI 接口和 GPIO 端口 A 外设就绪
while (!(*(uint32_t *)(SYSCTL_PRI2C)&(0x001 << 9)));
while (!(*(uint32_t *)(SYSCTL_PRGPIO)&(0x00001 << 0)));
//将 GPIO 备用功能配置为 I2C
*(((uint32_t *)(GPIO_PORta_AHB + GPIO_AFSEL))|=(0x03 << 0);
*((uint32_t *)(GPIO_Porta_AHB + GPIO_O_ODR))|=(0x01 << 1);
*(((uint32_t *)(GPIO_PORta_AHB + GPIO_PCTL))=(0x2 << 4 | 0x2 << 0);
*(((uint32_t *)(GPIO_PORta_AHB + GPIO_DEN))|=(0x03 << 0);
//将时钟源配置为使用 PIOSC
*((uint32_t *)(SYSCTL_PLLFREQ0))|=(0x1 << 23);
while (!(*(uint32_t *)(SYSCTL_PLLSTAT)));
*((uint32_t *)(SYSCTL_PLLFREQ0)))&=~(0x1 <<23);
//将 I2C 配置为主模式
*((uint32_t *)(I2C9 + I2C_O_MCR))|=(0x1 << 4);
//将 SCL 时钟速度配置为100kHz
*((uint32_t *)(I2C9 + I2C_O_MTPR))= 0x08;
//配置从机地址并在发送模式下运行
*((uint32_t *)(I2C9 + I2C_O_MSA))=(0x76 << 1 | 0x0 << 0);
//等待总线空闲
while (*(uint32_t *)(I2C9 + I2C_O_MCS)和0x00000001);
while (*(uint32_t *)(I2C9 + I2C_O_MCS)和0x00000040);
//发送1个字节的数据
*((uint32_t *)(I2C9 + I2C_O_MDR))= 0x12;
//启动1字节传输
*((uint32_t *)(I2C9 + I2C_O_MCS)= 0x03;
//等待 I2C 空闲且无错误
while (*(uint32_t *)(I2C9 + I2C_O_MCS)和0x00000001);
while (*(uint32_t *)(I2C9 + I2C_O_MCS)和0x00000002);
//发送1个字节的数据
*((uint32_t *)(I2C9 + I2C_O_MDR)= 0x34;
//启动1字节传输
*((uint32_t *)(I2C9 + I2C_O_MCS)= 0x01;
//等待 I2C 空闲且无错误
while (*(uint32_t *)(I2C9 + I2C_O_MCS)和0x00000001);
while (*(uint32_t *)(I2C9 + I2C_O_MCS)和0x00000002);
//发送1个字节的数据
*(((uint32_t *)(I2C9 + I2C_O_MDR))= 0x56;
//启动1字节传输
*((uint32_t *)(I2C9 + I2C_O_MCS)= 0x01;
//等待 I2C 空闲且无错误
while (*(uint32_t *)(I2C9 + I2C_O_MCS)和0x00000001);
while (*(uint32_t *)(I2C9 + I2C_O_MCS)和0x00000002);
//发送1个字节的数据
*((uint32_t *)(I2C9 + I2C_O_MDR)= 0x78;
//启动1字节传输
*((uint32_t *)(I2C9 + I2C_O_MCS)= 0x05;
//等待 I2C 空闲且无错误
while (*(uint32_t *)(I2C9 + I2C_O_MCS)和0x00000001);
while (*(uint32_t *)(I2C9 + I2C_O_MCS)和0x00000002);
while (1);
}