历史上的今天
今天是:2025年06月17日(星期二)
2020年06月17日 | MSP430F249硬件I2C查询法读写AT24C02
2020-06-17 来源:eefocus

/******************************************************************
**
** File : I2C.c | Master Read Write |
** Version : 1.0
** Description : I2C 查询法读写24C02
** Author : LightWu
** Date : 2013-4-26
** 必须注意多字节数据读取时,发送停止位需要在最后一个字节读取之前
** 否则数据读取后,停止位发送容易失败,导致从机接收不到停止位。
*******************************************************************/
#include //注意:两次发送间隔必须要有延时,否则不能再次发送,串口发送格式: unsigned char PTxData[250]; // Pointer to TX data unsigned char PRxData[250]; // Pointer to RX data void UartInit(void) { if (CALBC1_1MHZ==0xFF) // If calibration constant erased { while(1); // do not load, trap CPU!! } DCOCTL = 0; // Select lowest DCOx and MODx settings BCSCTL1 = CALBC1_1MHZ; // Set DCO DCOCTL = CALDCO_1MHZ; P3SEL |= 0x30; // P3.4,5 = USCI_A0 TXD/RXD UCA0CTL1 |= UCSSEL_2; // SMCLK UCA0BR0 = 104; // 1MHz 9600; (104)decimal = 0x068h UCA0BR1 = 0; // 1MHz 9600 UCA0MCTL = UCBRS0; // Modulation UCBRSx = 1 UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine** } void UartSend( unsigned char Data ) { UCA0TXBUF = Data; // TX -> RXed character while (!(IFG2&UCA0TXIFG)); // USCI_A0 TX buffer ready?,发送缓冲区空 } void IICInit(void) { UCB0CTL1 |= UCSWRST; // Enable SW reset UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC; // I2C Master, synchronous mode UCB0CTL1 = UCSSEL_2 + UCSWRST; // Use SMCLK, keep SW reset UCB0BR0 = 12; // fSCL = SMCLK/12 = ~100kHz UCB0BR1 = 0; UCB0I2CSA = 0xA0>>1; // Slave Address is ,注意地址需要右移一位,24C02地址为0XA0,故要写入0X50 // 7位地址模式,器件会发送一位读写位,正好8位。 UCB0CTL1 &= ~UCSWRST; // Clear SW reset, resume operation } /******************************************* 函数名称:Ucb0I2c_Start(void) 功 能:I2C主机模式,发送写起始条件 参 数:无 返回值 :无 ********************************************/ void Ucb0I2c_Start(void) { UCB0I2CSA = 0x50; // Slave Address is 0xd0 while (UCB0CTL1 & UCTXSTP); // Ensure stop condition got sent UCB0CTL1 |= UCTR + UCTXSTT; // I2C TX, start condition while(!(IFG2&UCB0TXIFG)); //等待传送完 IFG2 &= ~UCB0TXIFG; // Clear USCI_B0 TX int flag } void IICSendData( unsigned char Addr ,unsigned char Data ) { int i; for(i=3000;i>0;i--); //两次发送间隔必须要有延时,否则不能再次发送 Ucb0I2c_Start(); UCB0TXBUF = Addr; // Load TX buffer while(!(IFG2&UCB0TXIFG)); //等待传送完成 IFG2 &= ~UCB0TXIFG; // Clear USCI_B0 TX int flag UCB0TXBUF = Data; // Load TX buffer while(!(IFG2&UCB0TXIFG)); //等待传送完成 IFG2 &= ~UCB0TXIFG; // Clear USCI_B0 TX int flag UCB0CTL1 |= UCTXSTP; // I2C stop condition } void IICReadData( unsigned char Addr ) { int i; for(i=3000;i>0;i--); //两次发送间隔必须要有延时,否则不能再次发送 Ucb0I2c_Start(); UCB0TXBUF = Addr; // Load TX buffer while(!(IFG2&UCB0TXIFG)); //等待传送完成 IFG2 &= ~UCB0TXIFG; // Clear USCI_B0 TX int flag UCB0CTL1 &= ~UCTR ; // I2C RX, Read UCB0CTL1 |= UCTXSTT; // I2C RX, start condition while(!(IFG2&UCB0RXIFG)); //等待接收完成 IFG2&=~UCB0RXIFG; PRxData[0] = UCB0RXBUF; // Read RX buffer while(!(IFG2&UCB0RXIFG)); //等待接收完成 IFG2&=~UCB0RXIFG; PRxData[1] = UCB0RXBUF; // Read RX buffer while(!(IFG2&UCB0RXIFG)); //等待接收完成 IFG2&=~UCB0RXIFG; PRxData[2] = UCB0RXBUF; // Read RX buffer while(!(IFG2&UCB0RXIFG)); //等待接收完成 IFG2&=~UCB0RXIFG; //必须注意发送停止位在最后一个字节读取之前 UCB0CTL1 |= UCTXSTP; // I2C stop condition PRxData[3] = UCB0RXBUF; // Read RX buffer } int main(void) { WDTCTL = WDTPW + WDTHOLD; // Stop WDT P3SEL |= 0x06; // Assign I2C pins to USCI_B0 IICInit(); UartInit(); while (1) { UartSend('M'); IICSendData(0X00,'A'); IICSendData(0X01,'B'); IICSendData(0X02,'C'); IICSendData(0X03,'D'); IICSendData(0X04,'E'); IICSendData(0X05,'F'); IICSendData(0X06,'H'); IICSendData(0X07,'J'); IICReadData(0x00); UartSend(PRxData[0]); UartSend(PRxData[1]);
史海拾趣
|
我用的岭仪电子的8686WIFI(09) 驱动是该公司提供的 接口SPI 现在的问题是我可以读到ID,可以正常启动连网界面,但是目前发现,第一次不能连接上外网, 如果是自动分配IP则得到一个无效IP,手动分配也不能连上网络 解决方法:必须重新启动WIF ...… 查看全部问答> |
|
我在wince的应用程序里调用nandflash的驱动,但是nandflash驱动却调用不到FMD_OEMIoControl,有朋友能指点一下吗? 我在wince的应用程序里调用nandflash的驱动,但是nandflash驱动却调用不到FMD_OEMIoControl。 我用CreateFile来取得的nandflash驱动句柄,并且该句柄不为空。然后调用DeviceIoControl,总是返回失败,GetLastError返回的错误代码是87,参数错误的 ...… 查看全部问答> |
|
刚回来的EVM板,编译自带例程时总提示bios版本不兼容怎么回事啊?? 大侠指教啊~~ 具体如下: \\\"c:\\\\ti\\\\plugins\\\\bios\\\\gconfgen\\\" led.cdb \\\"led.cdb\\\", line 1: error: Version 4.90.270 is not compatible with this version of BIOS. Please open this file in the Configuration Tool ...… 查看全部问答> |
|
最近在调试F149的串口,快郁闷的不行了! 系统:F149 串口1,通信芯片MAX3485 收发数据均为查讯方式 9600Bps 工具:串口调试器 测试方式1:不停的向串口调试器发送数据,收到的数据没问题! 测试方式2:先向串口调试器发送数据,然后串口调试 ...… 查看全部问答> |
|
用msp430怎么使用32位的long型的数呢,我用了一下,貌似还是超不过65536?难道不支持32位的整数吗?假如我得表示一个大于65536的数该怎么办呢?… 查看全部问答> |




