上回我们说到了MG32F02A的UART0 SPI的使用。
突然发现原来IIC还没挂上来。。
由于代码比较多,就先只挂主机的吧:
- #include "MG32x02z_DRV.H"
- #include "iic.h"
- #include
- #include "MG32x02z_I2C_DRV.h"
- I2C_Struct* I2Cx;
- typedef uint8_t u8;
- typedef uint16_t u16;
- typedef uint32_t u32;
- typedef uint64_t u64;
- #define URTX URT0
- #define MYBINARYIMAGE2_LENGTH 20
- I2C_HandleTypeDef gSI2C0_Handle;
- I2C_HandleTypeDef gSI2C1_Handle;
- uint8_t SendBuf[MYBINARYIMAGE2_LENGTH]={0};
- uint8_t const String0[] = {"Wel"};
- uint8_t lDataBuffer[80];
- void Systick_Handler(void)
- {
- //to do......
- IncTick();
- }
- void CSC_Init (void)
- {
- CSC_PLL_TyprDef CSC_PLL_CFG;
- UnProtectModuleReg(MEMprotect); // Setting flash wait state
- MEM_SetFlashWaitState(MEM_FWAIT_ONE); // 50MHz> Sysclk >=25MHz
- ProtectModuleReg(MEMprotect);
- UnProtectModuleReg(CSCprotect);
- CSC_CK_APB_Divider_Select(APB_DIV_1); // Modify CK_APB divider APB=CK_MAIN/1
- CSC_CK_AHB_Divider_Select(AHB_DIV_1); // Modify CK_AHB divider AHB=APB/1
- /* CK_HS selection */
- CSC_IHRCO_Select(IHRCO_12MHz); // IHRCO Sel 12MHz
- CSC_IHRCO_Cmd(ENABLE);
- while(CSC_GetSingleFlagStatus(CSC_IHRCOF) == DRV_Normal);
- CSC_ClearFlag(CSC_IHRCOF);
- CSC_CK_HS_Select(HS_CK_IHRCO); // CK_HS select IHRCO
- /* PLL */
- /**********************************************************/
- CSC_PLL_CFG.InputDivider=PLLI_DIV_2; // 12M/2=6M
- CSC_PLL_CFG.Multiplication=PLLIx16; // 6M*16=96M
- CSC_PLL_CFG.OutputDivider=PLLO_DIV_2; // PLLO=96M/2=48M
- CSC_PLL_Config(&CSC_PLL_CFG);
- CSC_PLL_Cmd(ENABLE);
- while(CSC_GetSingleFlagStatus(CSC_PLLF) == DRV_Normal);
- CSC_ClearFlag(CSC_PLLF);
- /**********************************************************/
- /* CK_MAIN */
- CSC_CK_MAIN_Select(MAIN_CK_HS);
- /* Configure ICKO function */
- /* Configure peripheral clock */
- CSC_PeriphProcessClockSource_Config(CSC_I2C0_CKS, CK_APB);
- CSC_PeriphProcessClockSource_Config(CSC_UART0_CKS, CK_APB);
- CSC_PeriphOnModeClock_Config(CSC_ON_I2C0,ENABLE);
- CSC_PeriphOnModeClock_Config(CSC_ON_UART0,ENABLE);
- CSC_PeriphOnModeClock_Config(CSC_ON_PortB,ENABLE);
- CSC_PeriphOnModeClock_Config(CSC_ON_PortE,ENABLE);
- ProtectModuleReg(CSCprotect);
- }
- void I2C0_ByteMode_Master_Init(void)
- {
- I2C_InitTypeDef SI2C0_Init;
- SI2C0_Init.Instance = I2C0;
- SI2C0_Init.CK_I2C_PR_Frequency = 12000000;
- SI2C0_Init.SCL_Clock = 400000;
- I2C_ByteMode_Init(&SI2C0_Init);
- gSI2C0_Handle.Instance = I2C0;
- printf("I2C_IsDeviceReadynr");
- }
- DRV_Return I2C_ByteMode_Init(I2C_InitTypeDef *SI2C)
- {
- uint16_t lI2C_Pre = 1;
- uint16_t lI2C_DIV = 1;
- uint16_t lI2C_HT_LT = 0;
- uint16_t lI2C_LT;
- uint16_t lI2C_HT;
- PIN_InitTypeDef PINX_InitStruct;
- //===== Check I2C Busy =====//
- if(__I2C_GetFlagStatus(SI2C->Instance, I2C_FLAG_BUSYF))
- return DRV_Busy;
- __I2C_Disable(SI2C->Instance);
- //===== GPIO Initial =====//
- //===== CSC for GPIO Config =====//
- UnProtectModuleReg(CSCprotect); // Unprotect CSC module
- CSC_PeriphOnModeClock_Config(CSC_ON_PortB, ENABLE); // Enable PortB clock
- ProtectModuleReg(CSCprotect); // protect CSC module
- // //===== GPIO Config =====//
- PINX_InitStruct.PINX_Mode = PINX_Mode_OpenDrain_O; // Pin select pusu pull mode
- PINX_InitStruct.PINX_PUResistant = PINX_PUResistant_Enable; // Enable pull up resistor
- PINX_InitStruct.PINX_Speed = PINX_Speed_High;
- PINX_InitStruct.PINX_OUTDrive = PINX_OUTDrive_Level0; // Pin output driver full strength.
- PINX_InitStruct.PINX_FilterDivider = PINX_FilterDivider_Bypass; // Pin input deglitch filter clock divider bypass
- PINX_InitStruct.PINX_Inverse = PINX_Inverse_Disable; // Pin input data not inverse
- PINX_InitStruct.PINX_Alternate_Function = 2; // Pin AFS = 2
- if(SI2C->Instance == I2C0)
- {
- GPIO_PinMode_Config(PINB(10),&PINX_InitStruct); // I2C0 SCL setup at PB10
- GPIO_PinMode_Config(PINB(11),&PINX_InitStruct); // I2C0 SDA setup at PB11
- // GPIO_PinMode_Config(PINC(4),&PINX_InitStruct); // I2C0 SCL setup at PC4
- // GPIO_PinMode_Config(PINC(5),&PINX_InitStruct); // I2C0 SDA setup at PC5
- // GPIO_PinMode_Config(PINC(8),&PINX_InitStruct); // I2C0 SCL setup at PC8
- // GPIO_PinMode_Config(PINC(9),&PINX_InitStruct); // I2C0 SDA setup at PC9
- // GPIO_PinMode_Config(PIND(5),&PINX_InitStruct); // I2C0 SCL setup at PD5
- // GPIO_PinMode_Config(PIND(6),&PINX_InitStruct); // I2C0 SDA setup at PD6
- // GPIO_PinMode_Config(PINE(0),&PINX_InitStruct); // I2C0 SCL setup at PE0
- // GPIO_PinMode_Config(PINE(1),&PINX_InitStruct); // I2C0 SDA setup at PE1
- }
- if(SI2C->Instance == I2C1)
- {
- GPIO_PinMode_Config(PINC(10),&PINX_InitStruct); // I2C1 SCL setup at PC10
- GPIO_PinMode_Config(PINC(11),&PINX_InitStruct); // I2C1 SDA setup at PC11
- GPIO_PinMode_Config(PIND(8),&PINX_InitStruct); // I2C1 SCL setup at PD8
- GPIO_PinMode_Config(PIND(9),&PINX_InitStruct); // I2C1 SDA setup at PD9
- GPIO_PinMode_Config(PINE(2),&PINX_InitStruct); // I2C1 SCL setup at PE2
- GPIO_PinMode_Config(PINE(3),&PINX_InitStruct); // I2C1 SDA setup at PE3
- }
- //===== I2C Initial =====//
- //=== CSC for I2C Config ===//
- UnProtectModuleReg(CSCprotect); // Unprotect CSC module
- if(SI2C->Instance == I2C0)
- CSC_PeriphOnModeClock_Config(CSC_ON_I2C0, ENABLE); // Enable I2C0 module clock
- if(SI2C->Instance == I2C1)
- CSC_PeriphOnModeClock_Config(CSC_ON_I2C1, ENABLE); // Enable I2C1 module clock
- ProtectModuleReg(CSCprotect); // protect CSC module
- //=== I2C Config ===//
- //===== I2C Output Clock Config =====//
- // CK_I2C_PR
- // SCL Output Clock
- // HT + LT, <= 32 >=9, CK_I2C_PR / SCL Clock / Prescaler / DIV
- do{
- lI2C_HT_LT = SI2C->CK_I2C_PR_Frequency / SI2C->SCL_Clock / lI2C_Pre / lI2C_DIV;
- if((lI2C_HT_LT >= 32) || (lI2C_HT_LT <=9))
- {
- lI2C_Pre ++;
- if(lI2C_Pre > 8)
- {
- lI2C_Pre = 1;
- lI2C_DIV ++;
- }
- }
- }while((lI2C_HT_LT >= 32) || (lI2C_HT_LT <=9));
- lI2C_LT = (lI2C_HT_LT >> 1);
- lI2C_HT = lI2C_HT_LT - lI2C_LT;
- __I2C_SetClockSource(SI2C->Instance, I2C_CLK_SRC_PROC);
- __I2C_SetClockPrescaler(SI2C->Instance, lI2C_Pre - 1);
- __I2C_SetClockDivider(SI2C->Instance, lI2C_DIV - 1);
- __I2C_SetSCLHighTime(SI2C->Instance, lI2C_HT - 1);
- __I2C_SetSCLLowTime(SI2C->Instance, lI2C_HT - 1);
- //===== I2C Opration Mode Config =====//
- __I2C_GeneralCallAddress_Disable(SI2C->Instance);
- __I2C_SlaveAddressDetect_Disable(SI2C->Instance, (I2C_SADR_1 | I2C_SADR_2));
- //===== I2C Interrupt Config =====//
- if(SI2C->Instance == I2C0)
- {
- NVIC_EnableIRQ(I2C0_IRQn);
- NVIC_SetPriority(I2C0_IRQn, 1); // Suggest SYSTICK Priority = 0
- // Other Priority > 0
- }
- if(SI2C->Instance == I2C1)
- {
- NVIC_EnableIRQ(I2Cx_IRQn);
- NVIC_SetPriority(I2Cx_IRQn, 1); // Suggest SYSTICK Priority = 0
- // Other Priority > 0
- }
- __I2C_ITEA_Disable(SI2C->Instance);
- __I2C_IT_Disable(SI2C->Instance, (I2C_IT_TMOUT | I2C_IT_EVENT | I2C_IT_ERR | I2C_IT_BUF | I2C_IT_WUP));
- //===== I2C Timeout Config =====//
- __I2C_TMO_Disable(SI2C->Instance);
- __I2C_SetTimeOutClockSource(SI2C->Instance, I2C_TMO_CKS_DIV64);
- __I2C_SetTimeOutDetectionMode(SI2C->Instance, I2C_TMO_MDS_GENERAL);
- __I2C_SetTimeOutCount(SI2C->Instance, I2C_TMO_MDS_GENERAL);
- //===== I2C Enable =====//
- __I2C_Enable(SI2C->Instance);
- // I2Cx->CR0.B[0] |= I2C_CR0_BUF_EN_enable_b0;
- return DRV_Success;
- }
- void I2C_Delay(uint32_t Delay)
- {
- }
- DRV_Return I2C_IsDeviceReady(I2C_HandleTypeDef *SI2C, uint16_t DevAddress, uint32_t Trials)
- {
- //-----Check I2C Busy ------------------
- if(__I2C_GetFlagStatus(SI2C->Instance, I2C_FLAG_BUSYF) != CLR)
- return DRV_Busy;
- //-----Set_Config-----------------------
- SI2C->State.W = 0;
- SI2C->SlaveAddress = DevAddress & 0xFFFE;
- SI2C->pData = 0x00000000;
- SI2C->Count = 0;
- SI2C->Control.W = I2C_XferNext_STOP;
- //-----Start----------------------------
- do{
- SI2C->State.W = 0;
- Set_STA_STO_AA_100(SI2C->Instance);
- do{
- I2C_ByteMode_Handle(SI2C);
- }while(SI2C->State.MBit.Done == 0);
- if((SI2C->State.W & (I2C_State_BusError |
- I2C_State_ArbitrationLost |
- I2C_State_NACK)) == 0)
- return DRV_Success;
- I2C_Delay(1);
- }while(-- Trials > 0);
- return DRV_Failure;
- }
- void I2C_ByteMode_Handle(I2C_HandleTypeDef *SI2C)
- {
- uint8_t lState;
- if(__I2C_GetStateFlag(SI2C->Instance) == 0)
- return;
- lState = __I2C_GetStatusCode(SI2C->Instance);
- switch(lState){
- case 0x00: // Bus Error
- SI2C->State.W |= I2C_State_BusError |
- I2C_State_Done;;
- break;
- case 0x08: // SLA+W sent and ACK received
- case 0x10: // Repeated start condition
- Set_STA_STO_AA_000(SI2C->Instance);
- __I2C_SendSBUF(SI2C->Instance, ((uint8_t)SI2C->SlaveAddress));
- break;
- case 0x18: // MT SLA+W sent and ACK received
- case 0x28: // MT DATA sent and ACK received
- if(SI2C->Count == 0)
- {
- Set_STA_STO_AA_010(SI2C->Instance);
- __I2C_ClearStateFlag(SI2C->Instance);
- while(__I2C_GetStatusCode(SI2C->Instance) == lState);
- lState = __I2C_GetStatusCode(SI2C->Instance);
- SI2C->State.W |= I2C_State_Done;
- return;
- }
- __I2C_SendSBUF(SI2C->Instance, ((uint8_t)*SI2C->pData));
- SI2C->pData ++;
- SI2C->Count --;
- break;
- case 0x20: // MT SLA+W sent NACK received
- case 0x30: // MT DATA sent NACK received
- case 0x48: // MR SLA+R sent NACK received
- Set_STA_STO_AA_010(SI2C->Instance);
- __I2C_ClearStateFlag(SI2C->Instance);
- while(__I2C_GetStatusCode(SI2C->Instance) == lState);
- lState = __I2C_GetStatusCode(SI2C->Instance);
- SI2C->State.W |= I2C_State_NACK |
- I2C_State_Done;
- return;
- case 0x38: // Arbitration lost
- Set_STA_STO_AA_000(SI2C->Instance);
- SI2C->State.W |= I2C_State_ArbitrationLost |
- I2C_State_Done;
- break;
- case 0x40: // SLA+R sent and ACK received
- Set_STA_STO_AA_001(SI2C->Instance);
- case 0x50: // Data Received and ACK sent
- if(SI2C->Count <= 1)
- Set_STA_STO_AA_000(SI2C->Instance);
- *SI2C->pData = __I2C_ReceiveSBUF(SI2C->Instance);
- SI2C->Count--;
- SI2C->pData++;
- break;
- case 0x58: // Data Received and NACK sent
- if((SI2C->Control.W & I2C_XferNext_Mask) == I2C_XferNext_RepeatStart)
- Set_STA_STO_AA_100(SI2C->Instance);
- else
- Set_STA_STO_AA_010(SI2C->Instance);
- SI2C->State.W |= I2C_State_Done;
- break;
- //-------------------------------------
- case 0x60: // Own SLA+W has bee Received ACK has been returned
- case 0x68: // Arbitration lost in SLA+R/W as master,
- // Own SLA+W has been Received ACK has bee returned
- case 0x70: // General Call address has been received ACK has been returned
- case 0x78: // Arbitration lost in SLA+R/W as master,
- // General Call address has been received ACK has been returned
- case 0x80: // Data byte has been received ACK has been return
- case 0x88: // Data byte has been received Not ACK has been return
- case 0x90: // Previously address with General Call address
- // Data byte has been received ACK has been return
- case 0x98: // Previously address with General Call address
- // Data byte has been received Not ACK has been return
- case 0xA0: // A STOP or repeated START has been received while will addressed as SLV/REC
- case 0xA8: // Own SLA+R has bee Received ACK has been returned
- case 0xB0: // Arbitration lost in SLA+R/W as master,
- // Own SLA+R has been Received ACK has bee returned
- case 0xB8: // Data byte in SIDAT has been transmitted ACK has been received
- case 0xC0: // Data byte or Last data byte in SIDAT has been transmitted Not ACK has been received
- case 0xC8: // Last Data byte in SIDAT has been transmitted ACK has been received
- case 0xD0:
- case 0xD8:
- case 0xE0:
- case 0xE8:
- case 0xF0:
- case 0xF8: // Bus Idle
- default:
- break;
- }
- __I2C_ClearStateFlag(SI2C->Instance);
- while(__I2C_GetStateFlag(SI2C->Instance) != 0);
- }
- DRV_Return I2C_ByteMode_MasterTransmit(I2C_HandleTypeDef *SI2C, uint16_t DevAddress, uint8_t *pData, uint16_t Lenth)
- {
- //-----Check----------------------------
- if(__I2C_GetFlagStatus(SI2C->Instance, I2C_FLAG_BUSYF) != CLR)
- return DRV_Busy;
- //-----Set_Config-----------------------
- SI2C->State.W = 0;
- SI2C->SlaveAddress = DevAddress & 0xFFFE;
- SI2C->pData = pData;
- SI2C->Count = Lenth;
- SI2C->Control.W = I2C_XferNext_STOP;
- //-----Start----------------------------
- Set_STA_STO_AA_100(SI2C->Instance);
- do{
- I2C_ByteMode_Handle(SI2C);
- }while(SI2C->State.MBit.Done == 0);
- if((SI2C->State.W & (I2C_State_BusError |
- I2C_State_ArbitrationLost |
- I2C_State_NACK)) != 0)
- return DRV_Failure;
- return DRV_Success;
- }
- DRV_Return I2C_ByteMode_MasterReceive(I2C_HandleTypeDef *SI2C, uint16_t DevAddress, uint8_t *pData, uint16_t Lenth)
- {
- //-----Check----------------------------
- if(__I2C_GetFlagStatus(SI2C->Instance, I2C_FLAG_BUSYF) != CLR)
- return DRV_Busy;
- //-----Set_Config-----------------------
- SI2C->State.W = 0;
- SI2C->SlaveAddress = DevAddress | 0x0001;
- SI2C->pData = pData;
- SI2C->Count = Lenth;
- SI2C->Control.W = I2C_XferNext_STOP;
- //-----Start----------------------------
- Set_STA_STO_AA_100(SI2C->Instance);
- do{
- I2C_ByteMode_Handle(SI2C);
- }while(SI2C->State.MBit.Done == 0);
- if((SI2C->State.W & (I2C_State_BusError |
- I2C_State_ArbitrationLost |
- I2C_State_NACK)) != 0)
- return DRV_Failure;
- return DRV_Success;
- }
- void Sample_URT0_Init(void)
- {
- URT_BRG_TypeDef URT_BRG;
- URT_Data_TypeDef DataDef;
- PIN_InitTypeDef PINX_InitStruct;
- //==Set CSC init
- //MG32x02z_CSC_Init.h(Configuration Wizard)
- //Select CK_HS source = CK_IHRCO
- //Select IHRCO = 11.0592M
- //Select CK_MAIN Source = CK_HS
- //Configure PLL->Select APB Prescaler = CK_MAIN/1
- //Configure Peripheral On Mode Clock->Port B/URT0 = Enable
- //Configure Peripheral On Mode Clock->URT0->Select URT0_PR Source = CK_APB(11.0592)
- //==Set GPIO init
- //MG32x02z_GPIO_Init.h(Configuration Wizard)->Use GPIOB->Pin8/9
- //GPIO port initial is 0xFFFF
- //Pin8 mode is PPO/Pin9 mode is ODO
- //Pin8/9 pull-up resister Enable
- //Pin8/9 function URT0_TX/RX
- PINX_InitStruct.PINX_Mode = PINX_Mode_PushPull_O; // Pin select Push Pull mode
- PINX_InitStruct.PINX_PUResistant = PINX_PUResistant_Enable; // Enable pull up resistor
- PINX_InitStruct.PINX_Speed = PINX_Speed_Low;
- PINX_InitStruct.PINX_OUTDrive = PINX_OUTDrive_Level0; // Pin output driver full strength.
- PINX_InitStruct.PINX_FilterDivider = PINX_FilterDivider_Bypass; // Pin input deglitch filter clock divider bypass
- PINX_InitStruct.PINX_Inverse = PINX_Inverse_Disable; // Pin input data not inverse
- PINX_InitStruct.PINX_Alternate_Function = 3; // Pin AFS = URT0_TX
- GPIO_PinMode_Config(PINB(8),&PINX_InitStruct); // TXD at PB8
- PINX_InitStruct.PINX_Mode = PINX_Mode_OpenDrain_O; // Pin select Open Drain mode
- PINX_InitStruct.PINX_Alternate_Function = 3; // Pin AFS = URT0_RX
- GPIO_PinMode_Config(PINB(9),&PINX_InitStruct); // RXD at PB9
- //=====Set Clock=====//
- //---Set BaudRate---//
- URT_BRG.URT_InteranlClockSource = URT_BDClock_PROC;
- URT_BRG.URT_BaudRateMode = URT_BDMode_Separated;
- URT_BRG.URT_PrescalerCounterReload = 0; //Set PSR
- URT_BRG.URT_BaudRateCounterReload = 3; //Set RLR
- URT_BaudRateGenerator_Config(URTX, &URT_BRG); //BR115200 = f(CK_URTx)/(PSR+1)/(RLR+1)/(OS_NUM+1)
- URT_BaudRateGenerator_Cmd(URTX, ENABLE); //Enable BaudRateGenerator
- //---TX/RX Clock---//
- URT_TXClockSource_Select(URTX, URT_TXClock_Internal); //URT_TX use BaudRateGenerator
- URT_RXClockSource_Select(URTX, URT_RXClock_Internal); //URT_RX use BaudRateGenerator
- URT_TXOverSamplingSampleNumber_Select(URTX, 25); //Set TX OS_NUM
- URT_RXOverSamplingSampleNumber_Select(URTX, 25); //Set RX OS_NUM
- URT_RXOverSamplingMode_Select(URTX, URT_RXSMP_3TIME);
- URT_TX_Cmd(URTX, ENABLE); //Enable TX
- URT_RX_Cmd(URTX, ENABLE); //Enable RX
- //=====Set Mode=====//
- //---Set Data character config---//
- DataDef.URT_TX_DataLength = URT_DataLength_8;
- DataDef.URT_RX_DataLength = URT_DataLength_8;
- DataDef.URT_TX_DataOrder = URT_DataTyped_LSB;
- DataDef.URT_RX_DataOrder = URT_DataTyped_LSB;
- DataDef.URT_TX_Parity = URT_Parity_No;
- DataDef.URT_RX_Parity = URT_Parity_No;
- DataDef.URT_TX_StopBits = URT_StopBits_1_0;
- DataDef.URT_RX_StopBits = URT_StopBits_1_0;
- DataDef.URT_TX_DataInverse = DISABLE;
- DataDef.URT_RX_DataInverse = DISABLE;
- URT_DataCharacter_Config(URTX, &DataDef);
- //---Set Mode Select---//
- URT_Mode_Select(URTX, URT_URT_mode);
- //---Set DataLine Select---//
- URT_DataLine_Select(URTX, URT_DataLine_2);
- //=====Set Error Control=====//
- // to do...
- //=====Set Bus Status Detect Control=====//
- // to do...
- //=====Set Data Control=====//
- URT_RXShadowBufferThreshold_Select(URTX, URT_RXTH_1BYTE);
- URT_IdlehandleMode_Select(URTX, URT_IDLEMode_No);
- URT_TXGaudTime_Select(URTX, 0);
- //=====Enable URT Interrupt=====//
- URT_IT_Cmd(URTX, URT_IT_RX, ENABLE);
- URT_ITEA_Cmd(URTX, ENABLE);
- NVIC_EnableIRQ(URT0_IRQn);
- //=====Enable URT=====//
- URT_Cmd(URTX, ENABLE);
- //==See MG32x02z_URT0_IRQ.c when interrupt in
- }
- int fputc(int ch,FILE *f)
- {
- URT_SetTXData(URTX,1,ch);
- while(URT_GetITSingleFlagStatus(URTX,URT_IT_TC)==DRV_UnHappened);
- URT_ClearITFlag(URTX,URT_IT_TC);
- return ch;
- }
- void UartSendByte(int ch)
- {
- URT_SetTXData(URTX,1,ch);
- while(URT_GetITSingleFlagStatus(URTX,URT_IT_TC)==DRV_UnHappened);
- URT_ClearITFlag(URTX,URT_IT_TC);
- }
- void DMA_Init(void)
- {
- DMA_BaseInitTypeDef DMATestPattern;
- // ------------------------------------------------------------------------
- // 1.Enable DMA
- DMA_Cmd(ENABLE);
- // ------------------------------------------------------------------------
- // 2.Enable Channel0
- DMA_Channel_Cmd(DMAChannel0, ENABLE);
- // ------------------------------------------------------------------------
- DMA_BaseInitStructure_Init(&DMATestPattern);
- // 3.initial & modify parameter
- // DMA channel select
- DMATestPattern.DMAChx = DMAChannel0;
- // channel x source/destination auto increase address
- DMATestPattern.SrcSINCSel = ENABLE;
- DMATestPattern.DestDINCSel = DISABLE;
- // DMA source peripheral config
- DMATestPattern.SrcSymSel = DMA_MEM_Read;
- // DMA destination peripheral config
- DMATestPattern.DestSymSel = DMA_SPI0_TX;
- // DMA Burst size config
- DMATestPattern.BurstDataSize = DMA_BurstSize_1Byte;
- // DMA transfer data count initial number
- DMATestPattern.DMATransferNUM = MYBINARYIMAGE2_LENGTH;
- // source/destination config
- DMATestPattern.DMASourceAddr = (uint32_t *)&SendBuf;
- DMATestPattern.DMADestinationAddr = &SPI0->TDAT;//DMA_URT0_TX;// (uint8_t *)&RcvBuf;
- SPI_DMASend_Cmd(SPI0, ENABLE);
- DMA_Channel_Cmd(DMAChannel0, ENABLE);
- DMA_Base_Init(&DMATestPattern);
- }
- int main()
- {
- u32 i;
- char RxData;
- uint8_t AddrTemp;
- PIN_InitTypeDef PINX_InitStruct;
- CSC_Init();
- PINX_InitStruct.PINX_Mode = PINX_Mode_PushPull_O; // Pin select digital input mode
- PINX_InitStruct.PINX_PUResistant = PINX_PUResistant_Enable; // Enable pull up resistor
- PINX_InitStruct.PINX_Speed = PINX_Speed_Low;
- PINX_InitStruct.PINX_OUTDrive = PINX_OUTDrive_Level0; // Pin output driver full strength.
- PINX_InitStruct.PINX_FilterDivider = PINX_FilterDivider_Bypass;// Pin input deglitch filter clock divider bypass
- PINX_InitStruct.PINX_Inverse = PINX_Inverse_Disable; // Pin input data not inverse
- PINX_InitStruct.PINX_Alternate_Function = 0; // Pin AFS = 0
- GPIO_PinMode_Config(PINE(15),&PINX_InitStruct); // D6 setup at PE15
- Sample_URT0_Init();
- printf("hellon");
- I2C0_ByteMode_Master_Init();
- i=0;
- while(1)
- {
- i++;
- if(i>=500000)
- {
- i=0;
- PE15=0;
- if(I2C_IsDeviceReady(&gSI2C0_Handle, 0xA0, 10) != DRV_Success)
- printf("Target device is not readynr");
- if(I2C_ByteMode_MasterTransmit(&gSI2C0_Handle, 0xA0, (uint8_t *)String0, (sizeof(String0)-1)) != DRV_Success)
- printf("Mater transmited data failnr");
- if(I2C_ByteMode_MasterReceive(&gSI2C0_Handle, (uint16_t)0xA0, (uint8_t *)lDataBuffer, (sizeof(String0)-1)) != DRV_Success)
- printf("Mater received data failnr");
- RxData=I2C_ReceiveSBUF(I2C0);
- printf("receive:0x%02Xn",RxData);
- PE15=1;
- }
- }
- }
|