问题遇到的现象和发生背景
任务:通过MSP430 FR5994做I2C主机写入I2C从机monza芯片单字节,但代码收不到应答,请问代码有没有错误。环境:CCS11.1。
问题相关代码,请勿粘贴截图
#include <msp430.h>
unsigned char I2CBUF;
unsigned char checkbit;
#define SCL_H (P7OUT |= BIT1) // P7.1为SCL
#define SCL_L (P7OUT &= ~BIT1)
#define SDA_H (P7OUT |= BIT0) //p7.0为SDA
#define SDA_L (P7OUT &= ~BIT0)
#define SDA_OUT (P7DIR |= BIT0)
#define SDA_IN (P7DIR &= ~ BIT0)
#define SDA (P7IN & BIT0)
#define SDA1 (P7OUT | BIT0)
void I2C_Start(void) //I2C开始信号
{
SDA_OUT;
SCL_L;
SDA_H;
__delay_cycles(5);
SCL_H;
__delay_cycles(5);
SDA_L;
__delay_cycles(5);
SCL_L;
__delay_cycles(5);
}
unsigned char testACK(void) {
SDA_OUT;
SDA_H;
__delay_cycles(5);
SDA_IN;
unsigned char ACK;
__delay_cycles(5);
SCL_H;
__delay_cycles(5);
SCL_L;
if(P7IN & BIT0==0){
ACK=0;}
else{
ACK=1;
}
return (ACK);
/*SDA_IN;
__delay_cycles(5);
SCL_H;
__delay_cycles(5);
checkbit = (P7IN & BIT0) >> 4;
__delay_cycles(5);
SCL_L;
__delay_cycles(5);
return (checkbit);*/
}
void I2C_WRITE(unsigned char data)
{
SDA_OUT;
unsigned char i;
for (i = 8; i > 0; i--) //高位循环8次,发送1个字节数据
{
if (data & 0x80) //判断数据高位是0还是1
{
SDA_H ; //高位数据写1
}
else
{
SDA_L;
}
__delay_cycles(5);
SCL_H;
__delay_cycles(5); //发送数据
SCL_L;
__delay_cycles(5);
data <<= 1;
}
SDA_H ;
}
void blink(void) {
WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
PM5CTL0 &= ~LOCKLPM5; // Disable the GPIO power-on default high-impedance mode
// to activate previously configured port settings
P1DIR |= 0x01; // Set P1.0 to output direction
for(;;) {
volatile unsigned int i; // volatile to prevent optimization
P1OUT ^= 0x01; // Toggle P1.0 using exclusive-OR
i = 10000; // SW Delay
do i--;
while(i != 0);
}
}
void blink1(void) {
WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
PM5CTL0 &= ~LOCKLPM5; // Disable the GPIO power-on default high-impedance mode
// to activate previously configured port settings
P1DIR |= 0x01; // Set P1.0 to output direction
P1OUT |= 0x01; // Toggle P1.0 using exclusive-OR
}
int main(void)
{
I2C_Start();
I2C_WRITE(0X76);
unsigned char ack=testACK();
if(ack==0) //ack=0表示收到应答,led闪烁,否则LED只亮
{blink(); //收到应答就闪灯
}
else{
blink1();
}
;
return 0;
}
运行结果及报错内容
monzaX芯片I2C从机写地址为0XDC,但收不到从机应答(ack始终为1),请问代码有没有什么错误,谢谢。
我的解答思路和尝试过的方法
我想要达到的结果
通过I2C,MSP430 FR5994做主机写入monzaX芯片内存一个字节,谢谢