I2C环回模式
这是LM4F120H5QR I2C环回模式的程序,我使用PB2和PB3作为scl和sda。我无法从数据寄存器读取数据,MTPR(SCL时钟周期)也从7变为1I2C环回模式,c,arm,C,Arm,这是LM4F120H5QR I2C环回模式的程序,我使用PB2和PB3作为scl和sda。我无法从数据寄存器读取数据,MTPR(SCL时钟周期)也从7变为1 #include<stdio.h> #include<stdint.h> #include<lm4f120h5qr.h> void transmit() { while(I2C0_MASTER_MCS_R & 0x1); // WAIT TILL BUSY BIT IS FREE
#include<stdio.h>
#include<stdint.h>
#include<lm4f120h5qr.h>
void transmit()
{
while(I2C0_MASTER_MCS_R & 0x1); // WAIT TILL BUSY BIT IS FREE
I2C0_MASTER_MSA_R=0x0; // RS BIT-0 FOR TRANSMIT
I2C0_MASTER_MDR_R=0x0A; // WRITING DATA
I2C0_MASTER_MCS_R =0x03; //START + RUN BIT ENABLE
while(I2C0_MASTER_MCS_R & 0x1); //WAIT
I2C0_MASTER_MCS_R = 0x01; // ENABLE TRANSMIT
while(I2C0_MASTER_MCS_R & 0x1); // WAIT
I2C0_MASTER_MCS_R =0x05; //STOP
while(I2C0_MASTER_MCS_R & 0x1); //WAIT
}
int main()
{
char ch=0;
SYSCTL_RCC_R = 0x01521540; // CLOCK
SYSCTL_RCC2_R = 0xC1004000;
SYSCTL_RCGCI2C_R |= 0x01; // CLOCK FOR I2C
SYSCTL_RCGCGPIO_R |=0x02; //CLOCK FOR GPIO
GPIO_PORTB_DIR_R &= ~0x0C; // DIRECTION
GPIO_PORTB_AFSEL_R |= 0x0C; //ALTERNATE FUNCTION
GPIO_PORTB_PCTL_R |= 0x3300; // PORT CONTROL
GPIO_PORTB_DR2R_R |= 0x0C; // 2 mA
GPIO_PORTB_PUR_R |= 0x0C; // pull up resistors
GPIO_PORTB_ODR_R |= 0x08; // open drain for sda
GPIO_PORTB_DEN_R |= 0x0C; // digital enable
I2C0_MASTER_MCR_R |= 0x01; // loopback mode enable
I2C0_MASTER_MTPR_R |= 0x07; // scl clock period 100 kbps
transmit();
while(I2C0_MASTER_MCS_R & 0x1); // wait
I2C0_MASTER_MSA_R =0x0; // RS bit is 0 to txt clock
I2C0_MASTER_MCS_R = 0x03; // start+run
while(I2C0_MASTER_MCS_R & 0x1); //wait
I2C0_MASTER_MCS_R = 0x05; //stop
while(I2C0_MASTER_MCS_R & 0x1); // wait
I2C0_MASTER_MSA_R |=0x1; //RS bit 1 to receive
I2C0_MASTER_MCS_R= 0x0B; // ack+start+run
while(I2C0_MASTER_MCS_R & 0x1); //wait
ch=I2C0_MASTER_MDR_R; //reading the data
while(I2C0_MASTER_MCS_R & 0x1); // wait
I2C0_MASTER_MCS_R=0x05; //stop
while(I2C0_MASTER_MCS_R & 0x1); //wait
}
#包括
#包括
#包括
无效传输()
{
while(I2C0_MASTER_MCS_R&0x1);//等待忙位空闲
I2C0_MASTER_MSA_R=0x0;//用于传输的RS位0
I2C0\u MASTER\u MDR\u R=0x0A;//写入数据
I2C0\u MASTER\u MCS\u R=0x03;//启动+运行位启用
while(I2C0_MASTER_MCS_R&0x1);//等待
I2C0\u MASTER\u MCS\u R=0x01;//启用传输
while(I2C0_MASTER_MCS_R&0x1);//等待
I2C0\u MASTER\u MCS\u R=0x05;//停止
while(I2C0_MASTER_MCS_R&0x1);//等待
}
int main()
{
char ch=0;
SYSCTL_RCC_R=0x01521540;//时钟
SYSCTL_RCC2_R=0xC1004000;
SYSCTL_RCGCI2C_R |=0x01;//I2C的时钟
SYSCTL_RCGCGPIO|u R |=0x02;//GPIO的时钟
GPIO\u PORTB\u DIR\u R&=~0x0C;//方向
GPIO_PORTB_AFSEL_R |=0x0C;//备用函数
GPIO_端口B_PCTL_R |=0x3300;//端口控制
GPIO_端口B_DR2R|=0x0C;//2 mA
GPIO_PORTB_PUR|=0x0C;//上拉电阻器
GPIO_端口B_ODR|=0x08;//sda的排水明沟
GPIO_端口B_DEN|R |=0x0C;//数字启用
I2C0_MASTER_MCR|=0x01;//环回模式启用
I2C0_MASTER_MTPR|R |=0x07;//scl时钟周期100 kbps
传输();
while(I2C0_MASTER_MCS_R&0x1);//等待
I2C0_MASTER_MSA_R=0x0;//RS位是0到txt时钟
I2C0\u MASTER\u MCS\u R=0x03;//启动+运行
while(I2C0_MASTER_MCS_R&0x1);//等待
I2C0\u MASTER\u MCS\u R=0x05;//停止
while(I2C0_MASTER_MCS_R&0x1);//等待
I2C0_MASTER_MSA|R |=0x1;//要接收的RS位1
I2C0_MASTER_MCS_R=0x0B;//确认+启动+运行
while(I2C0_MASTER_MCS_R&0x1);//等待
ch=I2C0\u MASTER\u MDR\R;//读取数据
while(I2C0_MASTER_MCS_R&0x1);//等待
I2C0\u MASTER\u MCS\u R=0x05;//停止
while(I2C0_MASTER_MCS_R&0x1);//等待
}
注意:您应该使用CMSIS结构指针/成员访问,而不是传统的寄存器名@Someprogrammerdude@harper我是新手,我正在LM4F120H5QR中进行i2c环回测试。我直接使用的是寄存器而不是结构类型。有人可以发布i2c环回模式吗