|
TMS320VC5509A IIC_SPI程序源代码
void MCBSP_int(MCBSP_Handle m_Mcbsp) { IRQ_globalDisable(); MCBSP_ASSERT_HANDLE(m_Mcbsp,return 00); MCBSP_start(m_Mcbsp, MCBSP_XMIT_START | MCBSP_RCV_START | MCBSP_SRGR_START | MCBSP_SRGR_FRAMESYNC, 0x300u); asm( " nop"); asm( " nop"); asm( " nop"); asm( " nop"); spiintsign = MCBSP_getRcvEventId(m_Mcbsp);
IRQ_globalEnable(); return; }
interrupt void MCBSP1_RX() { IRQ_globalDisable(); m_Spi_Buf.lBuf[m_Spi_Buf.iHead++]= MCBSP_read8(hMcbsp1); if(m_Spi_Buf.iHead>=399)m_Spi_Buf.iHead=0;
IRQ_globalEnable(); }
unsigned int SendData(MCBSP_Handle m_Mcbsp,unsigned int *data,unsigned int len) { unsigned int i; unsigned int *p;
MCBSP_ASSERT_HANDLE(m_Mcbsp,return 0); if(data==NULL) return 0; p=data;
for(i=0;i<len;i++) { while (!MCBSP_xrdy(m_Mcbsp)); MCBSP_write8(m_Mcbsp, p[i]); }
return 1; }
void WriteFlash(MCBSP_Handle m_Mcbsp,int *data,unsigned long addr,int len,int m_Int) { int i,h,j=0; unsigned int s[5]; unsigned long add; memset(s,0,5); add=addr; for(i=0;i<len;i++) { s[0]=0x06; s[1]=0x00; s[2]=0x00; s[3]=0x00; s[4]=0x00; SendData(m_Mcbsp,s,5); s[0]=0x02; s[1]=(add>>16) & 0xff; s[2]=(add>>8) & 0xff; s[3]=add & 0xff; s[4]=*(data+j); j++; SendData(m_Mcbsp,s,5);
add+=1; while(1) { for(h=0;h<=1000;h++); if(!(ReadStatus(m_Mcbsp,m_Int))) break; } asm( " nop"); asm( " nop");
} }
void ReadFlash(MCBSP_Handle m_Mcbsp,unsigned long addr,int len,int m_Int) { int i; unsigned long add; add=addr; index=2; for(i=0;i<len;i++) {
ExIRQ_Disable(m_Int);
while (!MCBSP_xrdy(m_Mcbsp)); MCBSP_write8(m_Mcbsp, 0x03); while (!MCBSP_xrdy(m_Mcbsp)); MCBSP_write8(m_Mcbsp, add>>16); while (!MCBSP_xrdy(m_Mcbsp)); MCBSP_write8(m_Mcbsp, add>>8); while (!MCBSP_xrdy(m_Mcbsp)); MCBSP_write8(m_Mcbsp, add); while (!MCBSP_xrdy(m_Mcbsp)); MCBSP_write8(m_Mcbsp, 0x0); ExIRQ_Enable(m_Int); while (!MCBSP_xrdy(m_Mcbsp)); add+=1; } ExIRQ_Disable(m_Int); }
void EraseFlash(MCBSP_Handle m_Mcbsp,unsigned long addr,unsigned int m_index,int m_Int) { unsigned int i,u=0,s[5]; memset(s,0,5); s[0]=0x06; SendData(m_Mcbsp,s,5); if(m_index==0) { s[0]=0x52; s[1]=(addr>>16) & 0xff; s[2]=(addr>>8) & 0xff; s[3]=addr & 0xff; s[4]=0x0; SendData(m_Mcbsp,s,5); while(1) { for(i=0;i<=1000;i++); if(!(ReadStatus(m_Mcbsp,m_Int))) { u++; if(u>3)break; } } } else { s[0]=0x60; SendData(m_Mcbsp,s,5); while(1) { for(i=0;i<=1000;i++); if(!(ReadStatus(m_Mcbsp,m_Int))) { u++; if(u>3)break; } } } asm( " nop"); asm( " nop"); }
I2C_Config Config1 = { 0x0000, /* own address*/ 0x0000, /*isr*/ 0x0410, /*str*/ 0x002d, /*clkl*/ 0x002d, /*clkh*/ 0x0080, /*data count*/ 0x0050, /*slave address*/ 0x4600, /*cmdr*/ 0x0000, /*isr resource*/ 0x0014 /*psc*/ };
void iic_init1() { int i; /* int a[8]; // j=0; */ m_I2CMDR = (Uint16 *)0x3c09; for(i=0;i<10000;)i++; I2C_config(&Config1); for(i=0;i<10000;)i++; *m_I2CMDR |= 0x0020; /*使能数字锁相环模式*/ for(i=0;i<10000;)i++; }
int M_test() { static Uint16 IICMtest[4] = {0x00,0xf0,0xee,0xff}; static Uint16 testdata[2] = {0,0}; static Uint16 testadd[2] = {0x00,0xf0}; int j,a,b=1,q=0; for(j=0;j<=4;j++) /*写存储器测试字,若出错进行3次写入读出效验*/ { I2C_write(IICMtest,4,1,0x51,1,30000); delayiic(); I2C_write(testadd,2,1,0x51,1,30000); I2C_read(testdata,2,1,0x51,1,30000,1); for(a=0;a<2;a++) { if(testdata[a]==IICMtest[a+2])q=1; else q=0; b=b&q; } if(b==1)break; else if(j>=3) { DisP_Chat(&c_tab1[0]);/*显示错误信息,并清写卡标志,不再执行写卡操作*/ return b; } } return b; } int T_test() { static Uint16 IICTtest[3] = {0x12,0x51,0xAD}; static Uint16 testdata[2] = {0,0}; static Uint16 testadd[1] = {0x12}; int j,a,b=1,q=0; for(j=0;j<=4;j++) /*写存储器测试字,若出错进行3次写入读出效验*/ { I2C_write(IICTtest,3,1,0x50,1,30000); delayiic(); I2C_write(testadd,1,1,0x50,1,30000); I2C_read(testdata,2,1,0x50,1,30000,1); for(a=0;a<2;a++) { if(testdata[a]==IICTtest[a+1])q=1; else q=0; b=b&q; } if(b==1)break; else if(j>=3) { m_Keyboardinfo.TimeShowcard=0; DisP_Chat(&c_tab1[0]); firstdelay(); return b; } } return b; }
|