求msp430g2553的SPI和I2C的硬件模块代码
各位大哥大姐如果有的话请发我下现在很需要这些 谢谢各位大哥大姐了 哥哥姐姐们请帮帮忙啦 帮顶!我也需要啊! 我顶我也不会呀 貌似这些资料很少 IIC例程里有吧 {:sad:}正在学当中...看User'sguide会疯掉的 新手帮顶!同求啊!呵呵 #include "msp430g2553.h"#include"math.h" //Keil library
#include"stdio.h"
#define CPU_F ((double)1000000)
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0)) //延时x微秒
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0)) //延时x毫秒
#define uint unsigned int
#define uchar unsigned char
uchar TXByteCtr,RXByteCtr;
uchar TxData;
uchar RxBuf={0x00};
void Init_I2C(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 = 11; // fSCL = SMCLK/12 = ~100kHz
UCB0BR1 = 0;
P1SEL |= BIT6 + BIT7; // Assign I2C pins to USCI_B0
P1SEL2|= BIT6 + BIT7; // Assign I2C pins to USCI_B0
UCB0I2CSA = SlaveAddress;
UCB0CTL1 &= ~UCSWRST; // Clear SW reset, resume operation
}
void I2C_WriteMode(void)
{
UCB0CTL1 |= UCTR;
IFG2 &=~ UCB0TXIFG;
IE2 &=~ UCB0RXIE;
IE2 |= UCB0TXIE;
}
void I2C_ReadMode(void)
{
UCB0CTL1 &=~ UCTR;
IFG2 &=~ UCB0RXIFG;
IE2 &=~ UCB0TXIE;
IE2 |= UCB0RXIE; // 关闭发送中断,开启接收中断
}
/*----------------------------------------------------------------------------
功能:向I2C接口发送1个字节数据
输入:待发送字节个数 num,7-bit从机地址slave_addr
输出:
说明:在发送第1个字节过程中需要置位停止位,待发送数据放在TxData
----------------------------------------------------------------------------*/
void I2C_Txbyte(uchar Reg_addr,uchar Reg_data)
{
while(UCB0STAT & UCBBUSY);
I2C_WriteMode();
TxData=Reg_addr;
TxData=Reg_data;
TXByteCtr=2; // Load TX byte counter
UCB0CTL1 |= UCTXSTT; // I2C TX, start condition
//while (UCB0CTL1 & UCTXSTT);
__bis_SR_register(CPUOFF + GIE); // Enter LPM0 w/ interrupts
while (UCB0CTL1 & UCTXSTP);
}
void I2C_Rxbyte(uchar Reg_addr)
{
while(UCB0STAT & UCBBUSY);
I2C_WriteMode();
TxData=Reg_addr;
TXByteCtr=1; // Load TX byte counter
UCB0CTL1 |= UCTXSTT; // I2C TX, start condition
__bis_SR_register(CPUOFF + GIE); // Enter LPM0 w/ interrupts
while (UCB0CTL1 & UCTXSTP);
I2C_ReadMode();
RXByteCtr=1;
UCB0CTL1 |= UCTXSTT;
__bis_SR_register(CPUOFF + GIE);
while (IFG2 & UCB0RXIFG);
while (UCB0CTL1 & UCTXSTP);
}
#pragma vector = USCIAB0TX_VECTOR
__interrupt void USCIAB0TX_ISR(void)
{
if ( IFG2 & UCB0TXIFG )
{
if (TXByteCtr) // Check TX byte counter
{
TXByteCtr--;
UCB0TXBUF =TxData; // Load TX buffer // Decrement TX byte counter
}
else
{
UCB0CTL1 |= UCTXSTP; // I2C stop condition
IFG2&=~UCB0TXIFG; // Clear USCI_B0 TX int flag
//IE2 &=~UCB0TXIE;
__bic_SR_register_on_exit(CPUOFF); // Exit LPM0
}
}
if ( IFG2 & UCB0RXIFG )
{
if (RXByteCtr)
{
RXByteCtr--;
if(RXByteCtr==0)
{
UCB0CTL1 |= UCTXSTP+UCTXNACK;//必须在接受最后一个数据之前发送停止和NACK
}
RxBuf=UCB0RXBUF;
UCB0CTL1 &=~UCTXNACK;
}
else
{
//UCB0CTL1 |= UCTXSTP;
IFG2&=~UCB0RXIFG;
__bic_SR_register_on_exit(CPUOFF); // Exit LPM0
}
}
} 去我的帖子里面下载官方的例程,可以按着官方例程的模板来配置寄存器,做相应的更改就可以用了{:lol:} http://www.amobbs.com/thread-5561447-1-1.html 谢谢楼主!辛苦了
页:
[1]