ADuc7023的i2c转串口时,用串口助手接收到的为乱码

ruoluoyuan0186 2016-05-28 09:53:01
问题如标题所示。。
7023驱动的芯片是sc16is740,keil工程里面主要有三部分,I2C.c,sc16is740.c,还有主函数。
下载后并用TTL电平转USB的线进行通信,用串口助手接收数据为乱码,其中波特率为9600,数据长度为8bit,停止位为1,无校验位。
恳请各位大神告知解决办法啊~
附上三个文件的程序代码:

main.c:


#include "includes.h"

uchar szTxDataTest[] = {



"1234"

};
int32 ucTxCount = 0; // Array index variable for szTxData[]
int32 ucRxCount = 0; // Array index variable for szRxData[]



void m_delay(int l)
{
while(l)
{l--;}
l++;
}

void SYS_Init()
{
POWKEY1 = 0x01; // Configure CPU Clock for 41.78MHz, CD=0
POWCON = 0x00;
POWKEY2 = 0xF4;
IRQCONE |= 0x0000000C;
IRQEN = BIT16 +BIT10; // Enable I2C1 Master,XIRQ1,and interrupts

}
void LEDint()
{
//GP1CON &=0XFFFFFCFF;
GP1DAT = 0x01000000; //P1.0 as an output -- LED pin

}
uchar Int_Char(uchar *strOut,int intData)
{
int tempInt=0;
tempInt=intData ;
//((int)(cap_float/10))%10+48;
*(strOut+4)=intData%10+48;
tempInt=tempInt/10;
*(strOut+3)=tempInt%10+48;
tempInt=tempInt/10;
*(strOut+2)=tempInt%10+48;
tempInt=tempInt/10;
*(strOut+1)=tempInt%10+48;
tempInt=tempInt/10;
*(strOut)=tempInt%10+48;
return 0;
}

int main(void)
{
unsigned char choseFlag = 0;
SYS_Init();
I2C_Init();
SC16IS740Init();
LEDint();
LEDOFF;
Int_Char(RxTxBuffDataStr,sizeof(szTxDataTest));
while(1)
{

sc16is740UartSendStr(szTxDataTest,sizeof(szTxDataTest));

m_delay(25000);

if(SC16IS740IRQ==1)
{

memset(RxTxBuffDataStr,0,sizeof(RxTxBuffDataStr));
ucRxCount=sc16is740UartRxStr(RxTxBuffDataStr,sizeof(RxTxBuffDataStr));

sc16is740UartSendStr(RxTxBuffDataStr,ucRxCount);


SC16IS740IRQ=0;
}
}




return 0;
}
void IRQ_Handler(void) __irq
{
unsigned long IRQSTATUS;
IRQSTATUS = IRQSTA;

I2C_IRQ_Handler();
if ((IRQSTATUS & BIT16) == BIT16) //XIRQ3 interrupt source n has finished
{
IRQCLRE |= BIT16;

SC16IS740IRQ=1;
}
}
}
...全文
249 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
ruoluoyuan0186 2016-05-28
  • 打赏
  • 举报
回复
sc16is740.c: #include "includes.h" uchar RxTxBuffDataStr[BufferDataStrLen]={0}; uchar SC16IS740IRQ=0; uint16 baud=56000; uchar even_odd=UART_CONFIG_PAR_NONE; uchar dataWlen=UART_CONFIG_WLEN_8; uchar stopBit=UART_CONFIG_STOP_ONE; uchar RxFIFOlen=RX_FIFO_LEN60; uchar TxFIFOlen=TX_FIFO_LEN56; uchar SC16IS740_XTAL=SC16IS740_XTAL1_8432; //set SC16IS740 XTAL ÍⲿʱÖÓÊäÈë char SC16IS740Init(void) { IIC_UartInit(baud,even_odd,dataWlen,stopBit,RxFIFOlen,TxFIFOlen); return SC16IS740_NO_ERR; } /*********************º¯Êý¶¨Òå***********************/ char IIC_UartInit(uint16 baud,uchar even_odd,uchar dataWlen,uchar stopBit,uchar RxFIFOlen,uchar TxFIFOlen) { uchar icount=0; ///setData[]={0}, uchar setData=0; uchar regData=0; regData=0x80; write_sc16is740_reg(LCR,®Data,1); switch(SC16IS740_XTAL) { case SC16IS740_XTAL1_8432: { switch(baud) { case 56000: regData=2; break; case 38400: regData=3; break; case 19200: regData=6; break; case 9600: regData=12; break; case 7200: regData=16; break; case 4800: break; regData=24; case 3600: regData=32; break; case 2400: regData=48; break; case 2000: regData=58; break; case 1800: regData=64; break; case 1200: regData=96; break; default: return SC16IS740_BAUD_ERR; } } break; case SC16IS740_XTAL3_072: { switch(baud) { case 38400: regData=5; break; case 19200: regData=10; break; case 9600: regData=20; break; case 7200: regData=27; break; case 4800: break; regData=40; case 3600: regData=53; break; case 2400: regData=80; break; case 2000: regData=96; break; case 1800: regData=107; break; case 1200: regData=160; break; default: return SC16IS740_BAUD_ERR; } }break; default: return SC16IS740_BAUD_ERR; } write_sc16is740_reg(DLL,®Data,1); regData = 0x00; write_sc16is740_reg(DLH,®Data,1); regData = 0xbf; write_sc16is740_reg(LCR,®Data,1); regData = 0x10; write_sc16is740_reg(EFR,®Data,1); regData = 0x00; switch(dataWlen) { case UART_CONFIG_WLEN_5: regData |= 0x00; break; case UART_CONFIG_WLEN_6: regData |= 0x01; break; case UART_CONFIG_WLEN_7: regData |= 0x02; break; case UART_CONFIG_WLEN_8: regData |= 0x03; break; default: return SC16IS740_DATA_ERR; } switch(even_odd) { case UART_CONFIG_PAR_NONE: regData &= 0xC7; break; case UART_CONFIG_PAR_ODD: regData &= 0xcf; // regData |= 0x08; break; case UART_CONFIG_PAR_EVEN: regData &= 0xdf; regData |= 0x18; break; case UART_CONFIG_PAR_ONE: regData &= 0xef; regData |= 0x28; break; case UART_CONFIG_PAR_ZERO: regData |= 0x38; break; default: return SC16IS740_PRITY_ERR; } switch(stopBit) { case UART_CONFIG_STOP_ONE: regData &= 0xfb; break; default: regData |= 0x04; break; } write_sc16is740_reg(LCR,®Data,1); regData = 0x04; write_sc16is740_reg(MCR,®Data,1); regData = 0x00; write_sc16is740_reg(TLR,®Data,1); regData = 0x04; write_sc16is740_reg(TCR,®Data,1); regData = 0x06; write_sc16is740_reg(FCR,®Data,1); regData=0x01; switch(RxFIFOlen) { case RX_FIFO_LEN8: regData|=0x01; break; case RX_FIFO_LEN16: regData|=0x40; break; case RX_FIFO_LEN56: regData|=0x80; break; case RX_FIFO_LEN60: regData|=0xC0; break; default: return SC16IS740_ERR; } switch(TxFIFOlen) { case TX_FIFO_LEN8: regData|=0x01; break; case TX_FIFO_LEN16: regData|=0x10; break; case TX_FIFO_LEN32: regData|=0x20; break; case TX_FIFO_LEN56: regData|=0x30; break; default: return SC16IS740_ERR; } //regData = 0x51; //RX FIFO 16 characters,TX FIFO 16 characters, enable the transmit and receive FIFO write_sc16is740_reg(FCR,®Data,1); regData = 0x01; write_sc16is740_reg(IER,®Data,1); return 0; } char write_sc16is740_reg(uchar reg, uchar *data,int32 len) { uchar icount=0; reg=reg<<3; //ºóÈýλÇá0 I2CTxCountTemp=0; I2C1TxLen=len; pI2C1TxData=data; I2C1TxFinishFlag=0; I2C1FSTA |= BIT9; // ->1, Flush Master Tx FIFO I2C1FSTA &= ~BIT9; I2C1MTX = reg; I2C1ADR0=(SLVADDR_SC16IS740<<1); //009A while(I2C1TxFinishFlag!=1); return 0; } char read_sc16is740_reg(uchar reg, uchar *data,int32 len) { uchar icount=0; reg=(reg<<3); I2C1_WriteStr(SLVADDR_SC16IS740,WRITE,®,1); //,WRITE I2C1_ReadStr(SLVADDR_SC16IS740,data,len); return SC16IS740_NO_ERR; } ***********************************************/ uint16 sc16is740UartSendStr(uchar *data_buf,int32 data_len) { uint16 send_cnt = 0,i = 0; uchar *pdata = data_buf; uchar LSR_reg_stat = 0; uchar send_len = 0; if(0 == data_len) { return 0; } send_cnt = data_len/TxFIFOlen; for(i=0;i<(send_cnt+1);i++) { if(i == send_cnt) { send_len = data_len%TxFIFOlen-1; } else { send_len = TxFIFOlen-1; } write_sc16is740_reg(THR,pdata,send_len); pdata += TxFIFOlen; if(i<(send_cnt)) { while(1) { read_sc16is740_reg(LSR, &LSR_reg_stat,1); if(0x20 == (LSR_reg_stat & 0x20)) //LSR break; } } } } // write_sc16is740_reg(THR,data_buf,data_len); return data_len; } uint16 sc16is740UartRxStr(uchar *data_buf,int32 data_len) { uchar reg=0; uchar reg_stat=0; int32 i=0; data_len=0; read_sc16is740_reg(LSR, &(reg_stat),1); if(reg_stat & 0x01) { for(;;) { read_sc16is740_reg(RXLVL, ®_stat,1); reg_stat = reg_stat & 0x7f; if(reg_stat) // & 0x7F½ÓÊÕÆ÷ÖÐÓÐÊý¾Ý { read_sc16is740_reg(RHR,(data_buf+data_len),reg_stat);//¶ÁFIFOÖеÄÊý¾Ý¸öÊý+data_len data_len+=reg_stat; } else { break; } // LEDON; m_delay(120000); LEDOFF; m_delay(120000); } } return data_len; } char dataPackage() { return SC16IS740_NO_ERR; }
ruoluoyuan0186 2016-05-28
  • 打赏
  • 举报
回复
i2c.c: #include "includes.h" uchar *pI2C0TxData; uchar *pI2C0RxData; uchar *pI2C1TxData; uchar *pI2C1RxData; int I2C0TxLen; int I2C0RxLen; int I2C1TxLen; int I2C1RxLen; int I2CTxCountTemp; int I2CRxCountTemp; uchar I2C1TxFinishFlag=0; uchar I2C1RxFinishFlag=0; void I2C0_Restart() { //IRQCLR |= BIT8; I2C0FSTA |= BIT9; // Flush Master Tx FIFO I2C0FSTA &= ~BIT9; I2C0MTX = 0x01; I2C0ADR0 = 0x90; while(I2C0MSTA&0x0003); } void I2C_Init() { // Configure P0.4 and P0.5 for I2C mode GP0CON |= 0x22110000; // Only write to bits 4/5,6/7 POWKEY3 = 0x76; // Enable PWM, SPI, I2C0, I2C1 Peripherals with 41.78MHz clock POWCON1 = 0x924; POWKEY4 = 0xB1; I2C0MCON = BIT0 + BIT4 // Enable I2C Master + Enable Rx interrupt + BIT5 +BIT8; // Enable Tx interrupt + Enable transmission complete interrupt I2C0DIV = 0xCFCF; //0xCFCF Select clock rate 100Khz I2C1MCON = BIT0 + BIT4 // Enable I2C Master + Enable Rx interrupt + BIT5 + BIT7+ BIT8; // Enable Tx interrupt + Enable transmission complete interrupt I2C1DIV = 0x283C; // 0xC0C0;Select clock rate 100Khz 0x283C;Select clock rate 400Khz //I2C1DIV = 0xC0C0; } // int8 I2C1_WriteStr(uint16 slaverAddr,uchar r_w,uchar *pSendDataStr,int32 sendStrLen) { I2CTxCountTemp=0; I2C1TxLen=sendStrLen+1; pI2C1TxData=pSendDataStr; I2C1TxFinishFlag=0; I2C1FSTA |= BIT9; // ->1, Flush Master Tx FIFO I2C1FSTA &= ~BIT9; I2C1MTX =pI2C1TxData[I2CTxCountTemp++]; if(slaverAddr<=0xFF) //I2C1ADR0=(slaverAddr<<1); I2C1ADR0=(slaverAddr<<1)|(r_w&0x01); else { // I2C1ADR0=(0xF0|((slaverAddr&0x0300)>>7)); I2C1ADR0=(0xF0|((slaverAddr&0x0300)>>7))|(r_w&0x01); I2C1ADR1=slaverAddr&0x00FF; } while(I2C1TxFinishFlag!=1); return 0; } uchar I2C1_ReadStr(uint16 slaverAddr,uchar *pReadDataStr,int32 data_len) { I2CRxCountTemp=0; I2C1RxLen=data_len; pI2C1RxData=pReadDataStr; I2C1RxFinishFlag=0; I2C1MCNT0=data_len-1; if(slaverAddr<=0xFF) I2C1ADR0=(slaverAddr<<1)|0x01; else { I2C1ADR0=(0xF0|((slaverAddr&0x0300)>>7))|(0x01); I2C1ADR1=slaverAddr&0x00FF; } while( I2C1RxFinishFlag!=1) { } // return 0; } void I2C_IRQ_Handler() { uchar I2CMSTATUS0 = 0; uchar I2CMSTATUS1 = 0; unsigned long IRQSTATUS; IRQSTATUS = IRQSTA; if ((IRQSTATUS & BIT8) == BIT8) //If I2C0 Master interrupt source { I2CMSTATUS0 = I2C0MSTA; if ((I2CMSTATUS0 & BIT2) == BIT2) // If I2C0 Master Tx IRQ { } if ((I2CMSTATUS0 & BIT3) == BIT3) // If I2C0 Master Rx IRQ { } } /**********************I2C1 interrupt requestation*********************************/ if ((IRQSTATUS & BIT10) == BIT10) //If I2C1 Master interrupt source { I2CMSTATUS1 = I2C1MSTA; if((I2CMSTATUS1 & BIT2) == BIT2) // If I2C1 Master Tx IRQ { if (I2CTxCountTemp < (I2C1TxLen+1)) // { I2C1MTX =pI2C1TxData[I2CTxCountTemp++];// Load Tx buffer } else { I2C1TxFinishFlag=1; I2C1FSTA |= BIT9; // ->1, Flush Master Tx FIFO I2C1FSTA &= ~BIT9; } } if ((I2CMSTATUS1 & BIT3) == BIT3) // If I2C1 Master Rx IRQ ((I2CMSTATUS1 & BIT3) == BIT3) { if(I2CRxCountTemp<I2C1RxLen) //((I2C1FSTA&0x00C0) == 0x0040) { pI2C1RxData[I2CRxCountTemp++]=I2C1MRX; if(I2CRxCountTemp==I2C1RxLen) { I2C1RxFinishFlag=1; I2CRxCountTemp=0; I2C1FSTA |= BIT8; // ->1, Flush Master Rx FIFO I2C1FSTA &= ~BIT8; LEDON; m_delay(120000); LEDOFF; m_delay(120000); } } } if((I2CMSTATUS1 & BIT7) == BIT7) //I2CMNA,IICµ±Ö÷»ú½ÓÊÕµ½Ò»¸ö·ÇÓ¦´ðÌõ¼þ { } if((I2CMSTATUS1 & 0x03) == 0x00) //I2CMTFSTA ,I2CÖ÷»ú·¢ËÍFIFO״̬λ { } } /**********************I2C1 interrupt requestation END*********************************/ }

27,383

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧