#ifdef __USE_CMSIS
#include "LPC8xx.h"
#endif
#include <cr_section_macros.h>
#include "romI2C.h" //本コードはROMAPIを使用してないので、I2Cの定数定義部分のみ
#include "I2C_DEFINE.h"
#define LM75AAddr (0x48) //温度センサ アドレス
#define I2C_RW_W (0x00) //RW(LSB)はLCDは常に0
#define LM75TempRegi_pointer (0x00) //Tempレジスタポイタ
//Command:RS=0,Data:RS=1
#define LM75ConfRegi_pointer (0x01) //Configuration registerポインタ
int waiting=0;
void SwitchMatrix_Init();
void IOCON_Init();
void I2C_Init();
//void I2C_one_Byte_Write(uint8_t data);
void I2C_Multiple_Write(uint8_t Addr,uint8_t WriteByte,uint8_t *i2c_data);
void Systick_Init();
void I2C_Addr_WSend(uint8_t Addr);
void I2C_Addr_RSend(uint8_t Addr);
void Temp_SenceInit();
uint8_t I2C_Multiple_Read(uint8_t Addr,uint8_t ReadByte);
uint16_t ReadTemperture_LM75A(uint8_t Addr);
void mon_CFG(); //I2Cデータモニタ用関数
//void I2C_Stop();
//Systick
void SysTick_Handler(){
waiting=0;
}
static void wait_ms(uint32_t ms){
waiting=1;
SysTick_Config(SystemCoreClock/1000*ms);
while(waiting);
}
int main(void) {
int LED_C;
uint16_t temp=0;
LPC_GPIO_PORT->DIR0 |=(1<<1);
SystemCoreClockUpdate();
// Enter an infinite loop, just incrementing a counter
IOCON_Init();
SwitchMatrix_Init();
while(1){
temp=ReadTemperture_LM75A(LM75AAddr);
}
return 0 ;
}//main
void I2C_Init(){
LPC_SYSCON->PRESETCTRL &= ~(0x1<<6); //Assert Reset
LPC_SYSCON->PRESETCTRL |= (0x1<<6); //Clear Resett
//Set i2c clock DIV
LPC_I2C->DIV = 0x0001; //PCLK I2C Clock
LPC_I2C->MSTTIME=0; //Mater SCL Low Timee
LPC_I2C->CFG = I2C_CFG_MSTEN | 0x04; //マスターモード モニタイネーブル クロックストレッチ
}
void Temp_SenceInit(){ //温度センサ初期設定
uint8_t Config[3]={LM75AAddr,LM75ConfRegi_pointer,0x00}; //
I2C_Multiple_Write(LM75AAddr, 3, Config);
}
void I2C_Addr_WSend(uint8_t Addr){
while(!(LPC_I2C->STAT & I2C_STAT_MSTPENDING));
if((LPC_I2C->STAT & I2C_STAT_MSTSTATE) != I2C_STAT_MSTST_IDLE);
LPC_I2C->MSTDAT = (Addr<<1|0); // address and 0 for RWn bit
LPC_I2C->MSTCTL = I2C_MSTCTL_MSTSTART; // send start
while(!(LPC_I2C->STAT & I2C_STAT_MSTPENDING));
if((LPC_I2C->STAT & I2C_STAT_MSTSTATE) != I2C_STAT_MSTST_TX);
}
void I2C_Addr_RSend(uint8_t Addr){
while(!(LPC_I2C->STAT & I2C_STAT_MSTPENDING));
if((LPC_I2C->STAT & I2C_STAT_MSTSTATE) != I2C_STAT_MSTST_IDLE);
LPC_I2C->MSTDAT = (Addr<<1)|1; // address and 0 for RWn bit
LPC_I2C->MSTCTL = I2C_MSTCTL_MSTSTART; // send start
while(!(LPC_I2C->STAT & I2C_STAT_MSTPENDING));
if((LPC_I2C->STAT & I2C_STAT_MSTSTATE) != I2C_STAT_MSTST_RX);
}
void I2C_Multiple_Write(uint8_t Addr,uint8_t WriteByte,uint8_t *i2c_data){
//LPC_I2C->CFG = I2C_CFG_MSTEN; //マスターモード
I2C_Addr_WSend(Addr);
for (int i = 1; i < WriteByte; ++i){
while(!(LPC_I2C->STAT & I2C_STAT_MSTPENDING));
if((LPC_I2C->STAT & I2C_STAT_MSTSTATE) != I2C_STAT_MSTST_IDLE);//
LPC_I2C->MSTDAT = *(i2c_data+i); // send data
wait_ms(100); //wait
while(!(LPC_I2C->STAT & I2C_STAT_MSTPENDING));
LPC_I2C->MSTCTL = I2C_MSTCTL_MSTCONTINUE; // continue transaction
while(!(LPC_I2C->STAT & I2C_STAT_MSTPENDING));
if((LPC_I2C->STAT & I2C_STAT_MSTSTATE) != I2C_STAT_MSTST_TX); //break(); //abort();
while(!(LPC_I2C->STAT & I2C_STAT_MSTPENDING));
if((LPC_I2C->STAT & I2C_STAT_MSTSTATE) != I2C_STAT_MSTST_IDLE); //break();*/
}
LPC_I2C->MSTCTL = I2C_MSTCTL_MSTSTOP; //
while(!(LPC_I2C->STAT & I2C_STAT_MSTPENDING));
//if((LPC_I2C->STAT & I2C_STAT_MSTSTATE) != I2C_STAT_MSTST_IDLE);
}
//温度センサからの温度データ読みだし
uint16_t ReadTemperture_LM75A(uint8_t Addr){ //
uint8_t Readdata_MSB;
uint8_t Readdata_LSB;
uint16_t Readdata;
//I2C_Addr_RSend(Addr); //read
I2C_Addr_WSend(Addr); //write
LPC_I2C->MSTDAT = LM75TempRegi_pointer;
//LPC_I2C->MSTCTL = I2C_MSTCTL_MSTSTART; //RE-START
LPC_I2C->MSTCTL = I2C_MSTCTL_MSTCONTINUE; //
while(!(LPC_I2C->STAT & I2C_STAT_MSTPENDING));
if((LPC_I2C->STAT & I2C_STAT_MSTSTATE) != I2C_STAT_MSTST_TX);
LPC_I2C->MSTDAT = (Addr<<1)|1; //読みだし
LPC_I2C->MSTCTL = I2C_MSTCTL_MSTSTART; //RE=START
while(!(LPC_I2C->STAT & I2C_STAT_MSTPENDING));
Readdata_MSB=LPC_I2C->MSTDAT;
LPC_I2C->MSTCTL = I2C_MSTCTL_MSTCONTINUE;
while(!(LPC_I2C->STAT & I2C_STAT_MSTPENDING));
Readdata_LSB=LPC_I2C->MSTDAT;
while(!(LPC_I2C->STAT & I2C_STAT_MSTPENDING));
if((LPC_I2C->STAT & I2C_STAT_MSTSTATE) != I2C_STAT_MSTST_RX);
while(!(LPC_I2C->STAT & I2C_STAT_MSTPENDING));
LPC_I2C->MSTCTL = I2C_MSTCTL_MSTSTOP; // send stop NACKのスレーブへの送信
while(!(LPC_I2C->STAT & I2C_STAT_MSTPENDING));
if((LPC_I2C->STAT & I2C_STAT_MSTSTATE) != I2C_STAT_MSTST_IDLE) ;
Readdata=Readdata_MSB<<8|Readdata_LSB;
return Readdata;
}
void SwitchMatrix_Init()
{
/* Enable SWM clock */
LPC_SYSCON->SYSAHBCLKCTRL |= (1<<7|1<<5); //Enable SWM Clock,I2C Clock
LPC_SWM->PINASSIGN7 = 0x00ffffffUL; //SDA
/* I2C0_SCL */
LPC_SWM->PINASSIGN8 = 0xffffff04UL; //SCL
LPC_SWM->PINENABLE0 = 0xffffffb3UL;
LPC_SYSCON->SYSAHBCLKCTRL |= (1<<18); //Enables clock for IOCON block.
}
void IOCON_Init() {
/* Enable UART clock */
LPC_SYSCON->SYSAHBCLKCTRL |= (1<<18);
}
void Systick_Init(){
SysTick->CTRL=0; //Systick_Countter stop
SysTick->LOAD=12000; //1ms
SysTick->VAL=0; //
SysTick->CTRL=0x07; //Systick
}
void mon_CFG(){
uint32_t mondata;
mondata=LPC_I2C->MONRXDAT;
}